Android自定义组合控件的实现

ubvr3772 8年前
   <h2>一、定义一个XML布局文件</h2>    <p>setting_item_view.xml</p>    <pre>  <code class="language-java"><?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="60dip" >        <TextView          android:id="@+id/tv_title"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_alignParentLeft="true"          android:layout_marginLeft="5dip"          android:layout_marginTop="5dip"             android:textColor="#000000"          android:textSize="20dip" />        <TextView          android:id="@+id/tv_desc"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_below="@+id/tv_title"          android:layout_marginLeft="5dip"          android:layout_marginBottom="5dip"                 android:textColor="#99000000"          android:textSize="18dip" />        <CheckBox          android:clickable="false"          android:focusable="false"          android:id="@+id/cb_status"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_alignParentRight="true"          android:layout_centerVertical="true"          android:layout_marginRight="20dip" />        <View          android:layout_width="fill_parent"          android:layout_height="0.2dip"          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_marginLeft="5dip"          android:layout_marginRight="5dip"          android:background="#000000" />    </RelativeLayout></code></pre>    <h2>二、在src/values/attrs.xml中定义属性</h2>    <pre>  <code class="language-java"><?xml version="1.0" encoding="utf-8"?>  <resources>      <declare-styleable name="TextView">          <attr name="title" format="string" />          <attr name="desc_on" format="string" />          <attr name="desc_off" format="string" />      </declare-styleable>    </resources></code></pre>    <h2>三、自定义一个view继承自你需要的布局</h2>    <p>iniview(Context context)初始化自定义的布局文件</p>    <p>根据需求自定义一些API方法</p>    <pre>  <code class="language-java">public class SettingItemView extends RelativeLayout {      private CheckBox cb_status;      private TextView tv_title;      private TextView tv_desc;        private String title;      private String desc_on;      private String desc_off;            public void iniview(Context context){          View.inflate(context, R.layout.setting_item_view, this);          cb_status = (CheckBox)findViewById(R.id.cb_status);          tv_title = (TextView)findViewById(R.id.tv_title);          tv_desc = (TextView)findViewById(R.id.tv_desc);      }        public SettingItemView(Context context, AttributeSet attrs, int defStyle) {          super(context, attrs, defStyle);          iniview(context);      }        public SettingItemView(Context context, AttributeSet attrs) {          super(context, attrs);          iniview(context);          title = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.victor.mobilesafe","title");          desc_on = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.victor.mobilesafe","desc_on");          desc_off = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.victor.mobilesafe","desc_off");          tv_title.setText(title);          setDesc(desc_off);      }        public SettingItemView(Context context) {          super(context);          iniview(context);      }      public boolean isChecked(){          return cb_status.isChecked();        }      public  void setChecked(boolean checked){          if (checked) {              setDesc(desc_on);          }else{              setDesc(desc_off);          }          cb_status.setChecked(checked);        }      public void setDesc(String text){          tv_desc.setText(text);      }    }</code></pre>    <h2>四、在布局文件中使用该自定义组合控件</h2>    <p>别忘记声明自定义命名空间</p>    <p>xmlns:victor=" <a href="/misc/goto?guid=4959737519492339745" rel="nofollow,noindex">http://schemas.android.com/apk/res/com.victor.mobilesafe</a> "</p>    <pre>  <code class="language-java"><?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:victor="http://schemas.android.com/apk/res/com.victor.mobilesafe"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical" >   <com.victor.mobilesafe.ui.SettingItemView          android:id="@+id/siv_update"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          victor:desc_off="自动更新关闭"          victor:desc_on="自动更新开启"          victor:title="设置自动更新" >      </com.victor.mobilesafe.ui.SettingItemView>  </LinearLayout></code></pre>    <h2>总结:</h2>    <ol>     <li>自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup;</li>     <li>实现父类的构造方法。一般来说,需要在构造方法里初始化自定义的布局文件;</li>     <li>根据一些需要或者需求,定义一些API方法;</li>     <li>根据需要,自定义控件的属性,可以参照TextView属性;</li>     <li>自定义命名空间,例如:<br> xmlns:victor=" <a href="/misc/goto?guid=4959670324217369447" rel="nofollow,noindex">http://schemas.android.com/apk/res/</a> <包名>"<br> xmlns:victor=" <a href="/misc/goto?guid=4959737519492339745" rel="nofollow,noindex">http://schemas.android.com/apk/res/com.victor.mobilesafe</a> "</li>     <li>自定义我们的属性,在Res/values/attrs.xml</li>     <li>使用我们自定义的属性<br> 例如: <pre>  <code class="language-java">itheima:title="设置自动更新"   itheima:desc_on="设置自动更新已经开启"   itheima:desc_off="设置自动更新已经关闭"</code></pre> </li>     <li>在我们自定义控件的带有两个参数的构造方法里AttributeSet attrs 取出我们的属性值,关联自定义布局文件对应的控件;</li>    </ol>    <p> </p>    <p>来自:http://www.jianshu.com/p/b7bf190e74a4</p>    <p> </p>