Android自定义控件(一) 自定义组合控件

转载自:http://blog.csdn.net/smartbetter/article/details/50642730  侵删

为了能让代码能够更多的复用,故使用自定义组合控件。下面是一个"提示更新"自定义组合控件的实现。


一、应用场景(提高代码复用)


二、代码实现(以“提示更新自定义组合控件”为例)

1.创建一个java类SettingView,继承RelativeLayout,实现三个构造函数,并创建一个init方法,在构造函数中调用,在init方法中添加布局文件

[java]  view plain  copy
  1. package com.example.settingview;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.View;  
  6. import android.widget.CheckBox;  
  7. import android.widget.RelativeLayout;  
  8. import android.widget.TextView;  
  9.   
  10. public class SettingView extends RelativeLayout {  
  11.     private TextView tv_setting_title;  
  12.     private TextView tv_setting_des;  
  13.     private CheckBox cb_setting_ischecked;  
  14.     private String des_on;  
  15.     private String des_off;  
  16.     //在代码调用的时候使用  
  17.     public SettingView(Context context) {  
  18.         super(context);  
  19.         init();  
  20.     }  
  21.     //在布局文件中使用的时候调用,比两个参数的多个样式文件  
  22.     public SettingView(Context context, AttributeSet attrs, int defStyle) {  
  23.         super(context, attrs, defStyle);  
  24.         init();  
  25.     }  
  26.     //在布局文件中使用的时候调用  
  27.     public SettingView(Context context, AttributeSet attrs) {  
  28.         super(context, attrs);  
  29.         init();  
  30.         String title = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.example.settingview""title");  
  31.         des_on = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.example.settingview""des_on");  
  32.         des_off = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.example.settingview""des_off");  
  33.         //设置控件的值  
  34.         tv_setting_title.setText(title);  
  35.         if (isChecked()) {  
  36.             tv_setting_des.setText(des_on);  
  37.         }else{  
  38.             tv_setting_des.setText(des_off);  
  39.         }  
  40.     }  
  41.     /** 
  42.      * 添加布局文件 
  43.      */  
  44.     private void init(){  
  45.         //添加布局文件的操作  
  46. //      TextView textView = new TextView(getContext());  
  47. //      textView.setText("我是自定义组合控件的textview");  
  48.         //第一种方式  
  49.         //将布局文件转化成view对象  
  50. //      View view = View.inflate(getContext(), R.layout.settingview, null);//先有爹,再去添加孩子,亲生的  
  51. //      //添加  
  52. //      this.addView(view);//在相对布局中添加了textview  
  53.         //第二种方式  
  54.         //给转化的view对象,找个父控件,先转化成view对象,在添加到布局文件中  
  55.         View view = View.inflate(getContext(), R.layout.settingview, this);//先有孩子,再去找爹,喜当爹  
  56.         //初始化控件  
  57.         tv_setting_title = (TextView) view.findViewById(R.id.tv_setting_title);  
  58.         tv_setting_des = (TextView) view.findViewById(R.id.tv_setting_des);  
  59.         cb_setting_ischecked = (CheckBox) view.findViewById(R.id.cb_setting_ischecked);  
  60.     }  
  61.       
  62.     /** 
  63.      * 设置标题 
  64.      * @param title 
  65.      */  
  66.     public void setTitle(String title){  
  67.         tv_setting_title.setText(title);  
  68.     }  
  69.     /** 
  70.      * 设置描述信息 
  71.      * @param des 
  72.      */  
  73.     public void setDes(String des){  
  74.         tv_setting_des.setText(des);  
  75.     }  
  76.     /** 
  77.      * 设置checkbox的状态 
  78.      * @param isChecked 
  79.      */  
  80.     public void setChecked(boolean isChecked){  
  81.         cb_setting_ischecked.setChecked(isChecked);  
  82.         //相当于把sv_setting_update.setDes("已打开提示更新");封装到了setChecked方法中  
  83.         if (isChecked()) {  
  84.             tv_setting_des.setText(des_on);  
  85.         }else{  
  86.             tv_setting_des.setText(des_off);  
  87.         }  
  88.     }  
  89.     /** 
  90.      * 获取checkbox的状态 
  91.      * @return 
  92.      */  
  93.     public boolean isChecked(){  
  94.         return cb_setting_ischecked.isChecked();  
  95.     }  
  96.       
  97. }<span style="font-size:14px;">  
  98. </span>  


2.MainActivity.java代码

[java]  view plain  copy
  1. package com.example.settingview;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.SharedPreferences;  
  5. import android.content.SharedPreferences.Editor;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9.   
  10. public class MainActivity extends Activity {  
  11.   
  12.     private SettingView sv_setting_update;  
  13.     private SharedPreferences sp;  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_setting);  
  19.         sp = getSharedPreferences("config", MODE_PRIVATE);  
  20.         sv_setting_update = (SettingView) findViewById(R.id.sv_setting_update);  
  21.         update();  
  22.     }  
  23.   
  24.     /** 
  25.      * 提示更新 
  26.      */  
  27.     private void update() {  
  28.         // 初始化自定义组合控件中的控件的默认值  
  29.         // sv_setting_update.setTitle("提示更新");  
  30.         // getBoolean : 从sp中获取名称是update的数据信息,defValue:如果没有找到就是defValue,缺省值  
  31.         if (sp.getBoolean("update"true)) {  
  32.             // sv_setting_update.setDes("已打开提示更新");  
  33.             sv_setting_update.setChecked(true);  
  34.         } else {  
  35.             // sv_setting_update.setDes("已关闭提示更新");  
  36.             sv_setting_update.setChecked(false);  
  37.         }  
  38.         // 给自定义组合控件设置点击事件  
  39.         sv_setting_update.setOnClickListener(new OnClickListener() {  
  40.   
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 Editor edit = sp.edit();  
  44.                 // isChecked() : 获取当前checkbox的状态  
  45.                 if (sv_setting_update.isChecked()) {  
  46.                     // 关闭操作  
  47.                     sv_setting_update.setChecked(false);  
  48.                     // sv_setting_update.setDes("已关闭提示更新");  
  49.                     // 保存状态  
  50.                     edit.putBoolean("update"false);  
  51.                     // edit.apply();//保存到文件中的,但是仅限于9版本之上,9版本之下保存在内存  
  52.                 } else {  
  53.                     // 打开操作  
  54.                     sv_setting_update.setChecked(true);  
  55.                     // sv_setting_update.setDes("已打开提示更新");  
  56.                     edit.putBoolean("update"true);  
  57.                 }  
  58.                 edit.commit();  
  59.             }  
  60.         });  
  61.     }  
  62. }  


3.res资源文件代码

values/attrs.xml

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <!-- 自定义属性 -->  
  4.     <!-- 在activity_setting.xml中使用 -->  
  5.     <declare-styleable name="com.example.settingview.ui.SettingView">  
  6.         <attr name="title" format="string" /> <!-- format : 类型 -->  
  7.         <attr name="des_on" format="string" />  
  8.         <attr name="des_off" format="string" />  
  9.     </declare-styleable>  
  10. </resources>  

layout/settingview.xml

[java]  view plain  copy
  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="wrap_content" >  
  5.   
  6.     <!-- layout_margin : 距离父控件上下左右边框的距离 -->  
  7.   
  8.     <TextView  
  9.         android:id="@+id/tv_setting_title"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_margin="5dp"  
  13.         android:text="提示更新"  
  14.         android:textSize="18sp" />  
  15.   
  16.     <TextView  
  17.         android:id="@+id/tv_setting_des"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_below="@id/tv_setting_title"  
  21.         android:layout_marginLeft="5dp"  
  22.         android:text="已关闭提示更新"  
  23.         android:textColor="#aa000000"  
  24.         android:textSize="16sp" />  
  25.     <!-- checkbox天生带有点击事件和获取焦点的事件   
  26.     focusable :是否可以获取焦点,false:不可以   true:可以  
  27.     clickable : 是否可以点击   false:不可以   true:可以  
  28.     -->  
  29.     <CheckBox  
  30.         android:id="@+id/cb_setting_ischecked"  
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         android:layout_alignParentRight="true"  
  34.         android:layout_centerVertical="true"  
  35.         android:layout_marginRight="18dp"   
  36.         android:focusable="false"  
  37.         android:clickable="false"  
  38.         />  
  39.     <!-- layout_marginTop : 距离距离控件顶部的距离 -->  
  40.   
  41.     <View  
  42.         android:layout_width="match_parent"  
  43.         android:layout_height="0.5dp"  
  44.         android:layout_below="@id/tv_setting_des"  
  45.         android:layout_marginTop="5dp"  
  46.         android:background="#77000000" />  
  47.   
  48. </RelativeLayout>  

layout/activity_setting.xml

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:example="http://schemas.android.com/apk/res/com.example.settingview"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent" >  
  6.   
  7.     <!-- ScrollView :  只能有一个子控件,当屏幕放不下条目的时候,就会让屏幕,可以看到的时候就不会滑动-->  
  8.     <!-- 自定义属性 -->  
  9.     <!-- 系统用来声明属性用的:sdk\platforms\android-18\data\res\values\attrs.xml -->  
  10.     <com.example.settingview.SettingView  
  11.         android:id="@+id/sv_setting_update"  
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="wrap_content"  
  14.         example:des_off="已关闭提示更新"  
  15.         example:des_on="已打开提示更新"  
  16.         example:title="提示更新" >  
  17.     </com.example.settingview.SettingView>  
  18.   
  19. </ScrollView>  


4.我们运行一下,效果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值