Android_组合式控件_自定义属性

组合式控件

概念:多个零散的控件当成一个控件来看
应用的场景:当我们的应用程序有几个页面,都是出现了相同的布局,这个时候,我们也不想把他抽取成为样式,就可以使用组合式控件来解决问题了.

步骤:

  1. 抽取共用的控件代码,到一个布局里面
  2. 定义一个类,这个类继承有规定的,布局的根标签是什么类型,那么就必须继承什么类型
  3. 导入布局,把布局加入到容器里面
  4. 使用自定义的组合式控件

举一个使用组合式控件的例子:

第一步:
这部分的界面显示的代码,在多个界面重复出现,所以,我们就把他单独写到一个xml文件中,在layout写一个item_setting_view.xml的xml文件



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
     >

    <TextView
        android:id="@+id/siv_tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginTop="10dp"
        android:text="设置自动更新"
        android:textSize="18dp" />

    <ImageView
        android:id="@+id/siv_iv_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginTop="10dp"
        android:src="@drawable/on" />

RelativeLayout>

第二步:定义一个类去继承上面跟标签(RelativeLayout)


public class SettingItemView extends RelativeLayout {

    public SettingItemView(Context context, AttributeSet attrs, int defStyle)     {
        super(context, attrs, defStyle);
    }

    public SettingItemView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //第三步. 导入布局,把布局加入到容器里面
    /*
        解释一下:下面这句代码是怎么把,把布局加入到容器里面的.关键就在参数3.
    //参数三 写上this : 把这个布局装载到一个容器里面,  也就是装载到当前的这个容器,因为当前的这个类已经继承RelativeLayout(是一个容器) ,所以SettingItemView 也就是一个容器了.
    */
        View.inflate(context, R.layout.item_setting_view, this);

    }

    public SettingItemView(Context context) {
        super(context);
    }

}

已经定义好了组合式控件,怎么使用呢?

  1. 使用自定义的组合式控件

在其他的XMl文件使用组合式控件


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        style="@style/TitleBarStyle"
        android:text="设置中心" />
    
    <com.itheima.mobilesafe.view.SettingItemView  
       android:id="@+id/setting_siv_update"     
       itheima:title="设置"
       itheima:bg2="first"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

    <com.itheima.mobilesafe.view.SettingItemView
        itheima:bg2="last"
        android:layout_width="match_parent"
        itheima:title="骚扰拦截"
        android:layout_height="wrap_content" />
LinearLayout>

自定义属性

有很多时候,我们已经定义出来了组合式控件,为了丰富我们控件的功能,我们可以给我
们自己的控件添加自定义属性,比如android:text=”“;这个text就是属性.现在我们就去定义
类似这样的属性

步骤:
1. 在values文件夹下生成一个attrs.xml
2. 在里面声明属性
3. 在布局里面使用属性。
4. 读取属性
5. 给控件赋值

举一个例子:
1. 在values文件夹下生成一个attrs.xml


<resources>
    
    <declare-styleable name="SettingItemView">
     //2. 在里面声明属性
      
        <attr name="title" format="string" />

  
        <attr name="bg" format="reference">attr>


        <attr name="bg2">
            <enum name="first" value="0" />
            <enum name="middle" value="1" />
            <enum name="last" value="2" />
        attr>
    declare-styleable>

resources>

对于这个attr.xml文件可能大家对里面的属性,还有类型的定义不是很熟悉.
这个时候,我们可以去翻看源代码.红色圈出来的,是我的电脑找到的attr的路径.

Android_组合式控件_自定义属性_第1张图片

3. 在布局里面使用属性。


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:itheima="http://schemas.android.com/apk/res/com.itheima.mobilesafe"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        style="@style/TitleBarStyle"
        android:text="设置中心" />

    <com.itheima.mobilesafe.view.SettingItemView  
       android:id="@+id/setting_siv_update"     
       itheima:title="设置"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

    <com.itheima.mobilesafe.view.SettingItemView
        android:layout_width="match_parent"
        itheima:title="骚扰拦截"
        android:layout_height="wrap_content" />


LinearLayout>

在第三步的解释
首先需要添加命名的空间:
xmlns:itheima=”http://schemas.android.com/apk/res/com.itheima.mobilesafe”
com.itheima.mobilesafe是指自己的报名

然后在标签里面使用属性
itheima:title=”设置”. itheima:指的是,自己命名空间的前缀
这样设置完之后,还是不行的,因为是自定义的属性,我们还需要4,5步,
才可以把值正确的显示在界面

public class SettingItemView extends RelativeLayout {

    public SettingItemView(Context context, AttributeSet attrs, int defStyle)     {
        super(context, attrs, defStyle);
    }

    public SettingItemView(Context context, AttributeSet attrs) {
        super(context, attrs);
        View.inflate(context, R.layout.item_setting_view, this);

        //第四步:读取属性
        // 获取属性的集合
        //这句代码就是说,要获取到关于这个SettingItemView所以的属性
        TypedArray ta = context.obtainStyledAttributes(attrs,
                R.styleable.SettingItemView);


        // 读取到属性,获取到某一个属性,使用SettingItemView_XX来获取
        String title = ta.getString(R.styleable.SettingItemView_title);



    //  第五步: 给控件赋值
//R.id.siv_tv_title的这个id,其实就是我们item_setting_view.xml的xml文件中的TextView
//在博文的最上面有设置.晕的朋友可以返回到上面看看
        TextView tv = (TextView) findViewById(R.id.siv_tv_title);


        tv.setText(title);

    }

    public SettingItemView(Context context) {
        super(context);
    }

}

你可能感兴趣的:(Java基础,Android基础)