自定义View控件, 算是常见的用法. 刚接触安卓开发的时候, 很多人习惯在不同的XML布局文件里面Copy一大段代码, "达到相同View不断被使用的效果",但如果以后要改这个view了,估计也是很头疼的事情,而且一大段代码看起来也不够简洁. 而一旦自定义一个view, 就能在布局里面重复的调用它,而不必写一大段XML代码了. 这里用一个简单的例子介绍下.
比如这个布局: (一个RelativeLayout里面, 左右分别一个TextView),常见的是在某个列表里充当item
准备一个布局文件
首先, 当然是在layout文件夹新建这个布局文件: item_list_cus_2.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@color/white"
>
<TextView
android:id="@+id/tv_item_list_cus_2_title"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:textSize="16sp"
android:textColor="@color/font_black"
android:gravity="center_vertical"
android:text="内容展示"
android:textIsSelectable="true"
/>
<TextView
android:id="@+id/tv_item_list_cus_2_con"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:textSize="16sp"
android:textColor="@color/gray_high"
android:gravity="center_vertical"
android:text="内容展示二"
android:textIsSelectable="true"
/>
</RelativeLayout>
自定义属性
两个TextView都要使用类似setText(" ")的方法去设置自己的内容是吧.于是,在values文件夹新建一个attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ItemListCustomText">
<attr name="title" format="string" />
<attr name="content" format="string" />
</declare-styleable>
</resources>
我们假设,左边那个TextView是充当Title, 右边的TextView是充当content. 所以上面分别自定义title和content的属性, 格式都是string.
自定义View类,做控件
上面准备功夫做好.在 包里新建一个继承RelativeLayout的ItemListCustomText类, 请注意,这个名字必须和自定义属性XML文件中的name是一致的.public class ItemListCustomText extends RelativeLayout{
private TextView tv_left;
private TextView tv_rirght;
private String title;
private String content;
public ItemListCustomText(Context context, AttributeSet attrs) {
super(context, attrs);
View view = View.inflate(context, R.layout.item_list_custom_2, this);
tv_left = (TextView) view.findViewById(R.id.tv_item_list_cus_2_title);
tv_rirght = (TextView) view.findViewById(R.id.tv_item_list_cus_2_con);
TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.ItemListCustomText);
title = t.getString(R.styleable.ItemListCustomText_title);
if(title != null) tv_left.setText(title);
content = t.getString(R.styleable.ItemListCustomText_content);
if(content != null) tv_rirght.setText(content);
t.recycle();
}
public void setTitle(String title){
tv_left.setText(title);
}
public void setContent(String content){
tv_rirght.setText(content);
}
}
上面类中主要提供了两个方法, setTitle(String title) 和setContent(String content), 这样代码里就能通过在它们去设置文本内容.
使用自定义View的控件
要注意的地方:xmlns:itemText="http://schemas.android.com/apk/res/com.sample.android"
com.sample.android 这里应该写自己的包名,就是AndroidManifest.xml里面的那个,你懂的~
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:itemText="http://schemas.android.com/apk/res/com.sample.android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#F5F6F7"
>
<com.sample.android.widget.ItemListCustomText
android:id="@+id/area_self_info_onlineTime"
android:layout_width="match_parent"
android:layout_height="45dp"
itemText:title="标题"
itemText:content="内容"
/>
</LinearLayout>
上面是布局文件里面的调用. 当然,在代码里面也是直接可以用的.
在代码里findViewById后,直接调用自定义的方法设置文本即可.
itemText.setContent("标题~");
itemText.setContent("内容~");
以上,就是一个完整的自定义用法.例子虽简单,但是触类旁通.这样就能自己定义更复杂的一些View控件了.