• Android开发之自定义组合控件


    自定义组合控件的步骤
    1.自定义一个View,继承ViewGroup,比如RelativeLayout
    2.编写组合控件的布局文件,在自定义的view中加载
    (使用View.inflate())
    3.自定义属性,
    在value中创建一个attrs.xml文件,定义自己的属性
    4.在自定义View的java代码中完成逻辑
    5.在使用自定义view的布局文件中,添加自己的命名空间,在自定义view中,手动添加自己定义的属性

    如:

    1.自定义一个View,继承ViewGroup。命名为:setting_item_view.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="70dp"
     5     android:padding="5dp" >
     6 
     7     <TextView
     8         android:id="@+id/tv_title"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:textColor="@color/black"
    12         android:textSize="22sp" />
    13 
    14     <TextView
    15         android:id="@+id/tv_desc"
    16         android:layout_width="wrap_content"
    17         android:layout_height="wrap_content"
    18         android:layout_below="@id/tv_title"
    19         android:layout_marginTop="3dp"
    20         android:textColor="@color/gray"
    21         android:textSize="18sp" />
    22 
    23     <CheckBox
    24         android:id="@+id/cb_status"
    25         android:layout_width="wrap_content"
    26         android:layout_height="wrap_content"
    27         android:layout_alignParentRight="true"
    28         android:layout_centerVertical="true"
    29         android:clickable="false"
    30         android:focusable="false"
    31         android:focusableInTouchMode="false" />
    32 
    33     <View
    34         android:layout_width="match_parent"
    35         android:layout_height="0.3dp"
    36         android:layout_alignParentBottom="true"
    37         android:background="@color/gray" />
    38 
    39 </RelativeLayout>

    2.编写组合控件的布局文件,在自定义的view中加载。命名:SettingItemView.java

     1 import android.content.Context;
     2 import android.util.AttributeSet;
     3 import android.view.View;
     4 import android.widget.CheckBox;
     5 import android.widget.RelativeLayout;
     6 import android.widget.TextView;
     7 
     8 
     9 public class SettingItemView extends RelativeLayout {
    10 
    11     public SettingItemView(Context context, AttributeSet attrs,
    12             int defStyleAttr, int defStyleRes) {
    13         super(context, attrs, defStyleAttr, defStyleRes);
    14         initview();
    15     }
    16 
    17     public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {
    18         super(context, attrs, defStyleAttr);
    19         initview();
    20     }
    21 
    22     public SettingItemView(Context context, AttributeSet attrs) {
    23         super(context, attrs);
    24         initview();
    25     }
    26 
    27     public SettingItemView(Context context) {
    28         super(context);
    29         initview();
    30     }
    31 
    32     private void initview() {
    33         View.inflate(getContext(), R.layout.setting_item_view, this);
    34 
    35     }

    3.在value中创建一个attrs.xml文件,定义自己的属性,title, update_on, update_off

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <resources>
     3 
     4     <declare-styleable name="SettingItemView">
     5         <attr name="title" format="string" />
     6         <attr name="update_on" format="string" />
     7         <attr name="update_off" format="string" />
     8     </declare-styleable>
     9 
    10 </resources>

    4.在自定义View的java代码中完成逻辑,SettingItemView.java

     1 import android.content.Context;
     2 import android.util.AttributeSet;
     3 import android.view.View;
     4 import android.widget.CheckBox;
     5 import android.widget.RelativeLayout;
     6 import android.widget.TextView;
     7 
     8 
     9 public class SettingItemView extends RelativeLayout {
    10     // 命名空间,与布局文件中写的命名空间保持一致
    11     private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.haha.mobilesafe";
    12     private TextView tv_title;
    13     private TextView tv_desc;
    14     private CheckBox cb_status;
    15     private String mTitle;
    16     private String mUpdateOn;
    17     private String mUpdateOff;
    18 
    19     public SettingItemView(Context context, AttributeSet attrs,
    20             int defStyleAttr, int defStyleRes) {
    21         super(context, attrs, defStyleAttr, defStyleRes);
    22         initview();
    23     }
    24 
    25     public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {
    26         super(context, attrs, defStyleAttr);
    27         initview();
    28     }
    29 
    30     public SettingItemView(Context context, AttributeSet attrs) {
    31         super(context, attrs);
    32         mTitle = attrs.getAttributeValue(NAMESPACE, "title");
    33         mUpdateOn = attrs.getAttributeValue(NAMESPACE, "update_on");
    34         mUpdateOff = attrs.getAttributeValue(NAMESPACE, "update_off");
    35 
    36         initview();
    37     }
    38 
    39     public SettingItemView(Context context) {
    40         super(context);
    41         initview();
    42     }
    43 
    44     private void initview() {
    45         View.inflate(getContext(), R.layout.setting_item_view, this);
    46         tv_title = (TextView) findViewById(R.id.tv_title);
    47         tv_desc = (TextView) findViewById(R.id.tv_desc);
    48         cb_status = (CheckBox) findViewById(R.id.cb_status);
    49         setTitle(mTitle);
    50     }
    51 
    52     // 设置item的名称
    53     public void setTitle(String text) {
    54         tv_title.setText(text);
    55     }
    56 
    57     // 设置item的描述
    58     public void setDesc(String text) {
    59         tv_desc.setText(text);
    60     }
    61 
    62     // 获取checkbox是否勾选
    63     public boolean isChecked() {
    64         return cb_status.isChecked();
    65     }
    66 
    67     // 设置checkbox勾选状态
    68     public void setChecked(boolean check) {
    69         if (check) {
    70             setDesc(mUpdateOn);
    71         } else {
    72             setDesc(mUpdateOff);
    73         }
    74         cb_status.setChecked(check);
    75     }
    76 
    77 }

    5.在使用自定义view的布局文件中,添加自己的命名空间,在自定义view中,手动添加自定义的属性

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:haha="http://schemas.android.com/apk/res/com.haha.mobilesafe"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7 
     8     <TextView
     9         style="@style/titlebar"
    10         android:text="设置中心" />
    11 
    12     <com.haha.mobilesafe.view.SettingItemView
    13         android:id="@+id/siv_update"
    14         android:layout_width="match_parent"
    15         android:layout_height="wrap_content"
    16         haha:title="自动更新设置"
    17         haha:update_off="自动更新已关闭"
    18         haha:update_on="自动更新已开启" />
    19 
    20 </LinearLayout>
  • 相关阅读:
    单例模式
    说说抽象类接口
    闲说多态
    理解C#中的继承
    可变个数的形参的方法
    java 关键字
    数组的常见异常
    内存的基本结构 图片
    Java中的名称命名规范:
    死锁的例子 代码练习
  • 原文地址:https://www.cnblogs.com/liyiran/p/5127196.html
Copyright © 2020-2023  润新知