024_01自定义控件

1,首先在xml中做好样式:setting_item.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="60dp" >
 5         <TextView 
 6             android:id="@+id/tv_setting_title"
 7             android:layout_width="wrap_content"
 8             android:layout_height="wrap_content"      
 9             android:layout_margin="5dp"            
10             android:textSize="20sp"
11             />
12         <TextView 
13             android:id="@+id/tv_setting_description"
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:textSize="16sp"
17             android:layout_marginLeft="5dp"
18             android:layout_below="@id/tv_setting_title"
19             />
20         <CheckBox 
21              android:id="@+id/cb_settingitem"
22              android:layout_width="wrap_content"
23              android:layout_height="wrap_content"
24              android:layout_alignParentRight="true"
25              android:layout_centerVertical="true"
26              android:clickable="false"
27              android:focusable="false"
28             />
29        <View
30            android:layout_width="fill_parent"
31            android:layout_height="0.5dp"
32            android:background="#000000"
33            android:layout_alignParentBottom="true"
34            />
35            
36 </RelativeLayout>

 

2,新建一个继承自RelativeLayout的类SettingItem,该类就是自定义的控件。

  在构造函数中首先首先使用View的inflate()方法将setting_item.xml布局文件填充到SettingItem中,然后

使用findViewById()就可以找到setting_item.xml中的控件  View v = View.inflate(getContext(), R.layout.setting_item, this);

 在完成第3步自定义控件属性后,然后可在该类中获得如下代码中黄色标注的属性value

 

 1 package com.cskaoyan.mobilemanager.ui;
 2 
 3 import com.cskaoyan.mobilemanager.R;
 4 import android.content.Context;
 5 import android.util.AttributeSet;
 6 import android.view.View;
 7 import android.widget.CheckBox;
 8 import android.widget.RelativeLayout;
 9 import android.widget.TextView;
10 
11 public class SettingItem extends RelativeLayout {
12 
13     private TextView tv_setting_title;
14     private TextView tv_setting_description;
15     private String desc_checkbox_on;
16     private String desc_checkbox_off;
17     private CheckBox cb_settingitem;
18 
19 
20     public SettingItem(Context context, AttributeSet attrs, int defStyle) {
21         super(context, attrs, defStyle);
22         // TODO Auto-generated constructor stub
23         inti();
24     }
25 
26     
27 
28     public SettingItem(Context context, AttributeSet attrs) {
29         super(context, attrs);
30         inti();        
31        String itemname = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.cskaoyan.mobilemanager", "itemtitle");
32        desc_checkbox_on = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.cskaoyan.mobilemanager", "desc_checkbox_on");
33        desc_checkbox_off = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.cskaoyan.mobilemanager", "desc_checkbox_off");
34 
35        tv_setting_title.setText(itemname);
36        tv_setting_description.setText(desc_checkbox_off);
37     }
38 
39     public SettingItem(Context context) {
40         super(context);
41         // TODO Auto-generated constructor stub
42         inti();    
43     }
44     
45     
46     /**
47      * 这个初始化函数需要完成的使命是:
48      * 需要在构造这样一个相对不布局的时候,把里面填充三个简单控件
49      */
50     private void inti() {
51         // TODO Auto-generated method stub
52         
53 /*        View view=        View.inflate(getContext(), R.layout.setting_item, null);    
54         this.addView(view);*/
55         
56          View v=         View.inflate(getContext(), R.layout.setting_item, this);
57          
58          tv_setting_title = (TextView) v.findViewById(R.id.tv_setting_title);
59          
60          tv_setting_description = (TextView) v.findViewById(R.id.tv_setting_description);
61          cb_settingitem = (CheckBox) v.findViewById(R.id.cb_settingitem);
62 
63     }
64     
65 
66     
67     public void setdescription(String text){
68         tv_setting_description.setText(text);
69     }
70 
71     
72     public void setdescriptionon(){
73         tv_setting_description.setText(desc_checkbox_on);
74     }
75     
76     public void setdescriptionoff(){
77         tv_setting_description.setText(desc_checkbox_off);
78     }
79     
80     public boolean getChecked(){
81         
82         return cb_settingitem.isChecked();
83         
84     }
85     
86     public void setCheck(boolean checked){
87         cb_settingitem.setChecked(checked);
88         if (checked) {
89             setdescriptionon();
90         }
91         else {
92             setdescriptionoff();
93         }
94         
95     }
96 
97 }

 

3,在/res/values/ 文件夹下建立 attrs.xml 对自定义控件设置需要的属性

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3         <declare-styleable name="com.cskaoyan.mobilemanager.ui.SettingItem">
4              <attr name="itemtitle" format="string"/>
5              <attr name="desc_checkbox_on" format="string"/>
6              <attr name="desc_checkbox_off" format="string"/>
7         </declare-styleable>
8 </resources>

 

  在别的布局文件中设定自定义控件的属性值后, SettingItem.java中就会通过 tv_setting_title.setText(itemname)    tv_setting_description.setText(desc_checkbox_off)将setting_item.xml中控件的文本显示进行设置,实质上最终是设置了setting_item.xml中的控件属性

1      <com.cskaoyan.mobilemanager.ui.SettingItem
2           android:id="@+id/settingitem_autoupdate"
3           android:layout_width="fill_parent"
4           android:layout_height="wrap_content"
5           cskaoyan:itemtitle="自动更新"
6           cskaoyan:desc_checkbox_on="自动更新开启"
7           cskaoyan:desc_checkbox_off="自动更新关闭"/>

 

也可以在SettingItem.java写好一些方法让其他类来调用达到修改的目的

 1     public void setdescription(String text){
 2         tv_setting_description.setText(text);
 3     }
 4 
 5     
 6     public void setdescriptionon(){
 7         tv_setting_description.setText(desc_checkbox_on);
 8     }
 9     
10     public void setdescriptionoff(){
11         tv_setting_description.setText(desc_checkbox_off);
12     }

 

posted @ 2015-06-13 16:43  woodrow_woo  阅读(119)  评论(0编辑  收藏  举报