Android自定义View控件

自定义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控件了.



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。