Android自定义控件常见的有如下几种方式
继承View
继承Button等已有的控件
继承ViewGroup
继承LinearLayout等已有的ViewGroup
其中第四种是最简单也是最常用的方式,通过继承LinearLayout等已有的ViewGroup,里面再放一些Buttong、TextView等其他已有的控件或ViewGroup,把他们组装起来就形成了一个新的自定义控件,再通过自定义的属性就可以对控件的一些属性进行赋值,达到复用的效果
虽然说很简单,但是每次写要重新百度下怎么写,这里写一个自定义的标题栏当做备忘,也分享给大家
public class TitleView extends FrameLayout {
private TextView title;
private TypedArray typedArray;
public TitleView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title_bar_layout, this, true);
typedArray=context.obtainStyledAttributes(attrs, R.styleable.title_bar);
initTitle();
typedArray.recycle();
}
/**
* 初始化标题。
*/
private void initTitle() {
title = (TextView) findViewById(R.id.title_bar_title);
String titleName = typedArray.getString(R.styleable.title_bar_title_name);
title.setText(titleName);
}
public void setTitle(String titleName) {
title.setText(titleName);
}
public void setTitle(int titleName) {
title.setText(titleName);
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title_bar_title"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="45dp"/>
</FrameLayout>
自定义属性,定义在values/attrs.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="title_bar">
<attr name ="title_name" format= "string"/>
</declare-styleable >
</resources>
使用
<?xml version="1.0" encoding= "utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
//命名空间的名字随意,后面的值由http://schemas.android.com/apk/res/+应用的包名
//xmlns:app="http://schemas.android.com/apk/res-auto"(这种格式也行)
xmlns:app="http://schemas.android.com/apk/res/cn.himmy.title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EFEFE7"
android:gravity="center_horizontal"
android:orientation="vertical" >
<com.imcore.yunming.common.ui.TitleView
android:id="@+id/mine_edit_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
//前缀和命名空间的命名一致,属性名在value/attrs资源文件中定义。
app:title_name="野原新一"/>
</LinearLayout>
代码很简单,功能也很简单,就是一个标题栏,可以通过app:title_name自定义属性设置标题,虽然简单,但是写法很通用
只要写法懂了,可以通过这种方式组装出任何复杂的自定义控件
比如可以在这个自定义控件左边加一个返回按钮,右边加一个功能按钮等等