Android 组合控件

1,实现逻辑:

组合控件:

【1】创建SettingItemView继承RelativeLayout 或者 LinearLayout 或者ViewGroup

【2】构造方法中this 传递方法。减少代码重复使用

【3】创建itme布局,添加子view的布局

【4】在要使用控件的布局文件中使用控件。

自定义属性:

【1】在values文件夹里 创建attrs.xml  文件

【2】按照规定语法 添加属性,参考sdk 中Textview中的属性,添加命名空间

【3】获取需要设置值的控件(findviewbyid)

【4】 在构造方法里取出需要设置的属性的值进行赋值

3,实现代码:

组合控件:

【1】创建想组合的控件布局







    



    



【2】继承RelativeLayout重写构造方法this传递,initView中添加布局显示

package view;



import android.annotation.SuppressLint;

import android.annotation.TargetApi;

import android.content.Context;

import android.content.res.TypedArray;

import android.os.Build;

import android.util.AttributeSet;

import android.view.View;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;



import com.sjws.R;



/**

* Created by Lenovo on 2019/2/22.

*/



public class SettingItemView extends RelativeLayout {



    private TextView tvTitle;

    private ImageView ivToggle;



    public SettingItemView(Context context) {

        this(context,null);

    }

/**

     * 在布局文件里用的时候 走这个构造

     *

     * @param context

     * @param attrs

     *            布局里设置的所有的属性 都在这个对象里

     */

    public SettingItemView(Context context, AttributeSet attrs) {

        this(context, attrs,-1);

    }

/**

     * 在布局文件里用的时候 并且设置了样式 走这个构造

     *

     * @param context

     * @param attrs

     *            布局里设置的所有的属性 都在这个对象里

     */

    public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        initView();

     

    }



    private void initView() {

        // 1.生成要添加的子view

        View child = View.inflate(getContext(), R.layout.view_setting_item,

                null);

        addView(child);

        // 小标题

        tvTitle = (TextView) findViewById(R.id.tv_siv_title);

        // 右侧的开关图片

        ivToggle = (ImageView) findViewById(R.id.iv_siv_toggle);

    }

}

【3】在想要展示的页面调用控件





    



    

    



    







自定义属性:因为每个控件都不一样,要给他附加不同的值,但是组合控件里面没有相对应的属性,我们自己定义属性来使用

 

【1】 values文件夹里 创建attrs.xml  名字不要全命名







    

        

        

        

            

            

            

        

    



 

【2】在要展示的布局中添加命名空间,调用属性发现没有用,我们需要在空间中获取属性设置





    



    

    



    





 

【3】 在构造方法里取出需要设置的属性的值

package view;



import android.content.Context;

import android.content.res.TypedArray;

import android.util.AttributeSet;

import android.view.View;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;



import com.sjws.R;



/**

* 组合控件

* Created by Lenovo on 2019/2/22.

*/



public class SettingItemView extends RelativeLayout {



    private TextView tvTitle;

    private ImageView ivToggle;



    public SettingItemView(Context context) {

        this(context,null);

    }

    /**

     * 在布局文件里用的时候 走这个构造

     *

     * @param context

     * @param attrs

     *            布局里设置的所有的属性 都在这个对象里

     */

    public SettingItemView(Context context, AttributeSet attrs) {

        this(context, attrs,-1);

    }

    /**

     * 在布局文件里用的时候 并且设置了样式 走这个构造

     *

     * @param context

     * @param attrs

     *            布局里设置的所有的属性 都在这个对象里

     */

    public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        initView();

        // 取出从布局文件里设置的属性值 都在attrs对象里

        // 参1 要检索的全部 的属性集合 参2 检出出的属性的int数组 R文件已经生成

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SettingItemView);



        // 取出小标题的内容

        String title = typedArray

                .getString(R.styleable.SettingItemView_siv_title);

        // 取出右侧图片是否显示的状态

        boolean isShow = typedArray.getBoolean(

                R.styleable.SettingItemView_siv_enable, true);

        // 取出设置的背景的枚举值

        int bgId = typedArray.getInt(

                R.styleable.SettingItemView_siv_background, 0);

        //用完释放一下

        typedArray.recycle();

          // 给控件赋值

        tvTitle.setText(title);

        // 控制view是否显示

        ivToggle.setVisibility(isShow ? View.VISIBLE : View.INVISIBLE);

        // 背景

        switch (bgId) {

            case 0:

                setBackgroundResource(R.drawable.first_selector);

                break;

            case 1:

                setBackgroundResource(R.drawable.middle_selector);

                break;

            case 2:

                setBackgroundResource(R.drawable.last_selector);

                break;

            default:

                break;

        }

    }

        private void initView() {}

}



【4】 initview中获取需要设置值的控件(findviewbyid)


 

   private void initView() {

        // 1.生成要添加的子view

        View child = View.inflate(getContext(), R.layout.view_setting_item,

                null);

        addView(child);

        // 小标题

        tvTitle = (TextView) findViewById(R.id.tv_siv_title);

        // 右侧的开关图片

        ivToggle = (ImageView) findViewById(R.id.iv_siv_toggle);



    }

【5】给控件赋值

  // 给控件赋值

        tvTitle.setText(title);

        // 控制view是否显示

        ivToggle.setVisibility(isShow ? View.VISIBLE : View.INVISIBLE);

        // 背景

        switch (bgId) {

            case 0:

                setBackgroundResource(R.drawable.first_selector);

                break;

            case 1:

                setBackgroundResource(R.drawable.middle_selector);

                break;

            case 2:

                setBackgroundResource(R.drawable.last_selector);

                break;

            default:

                break;

        }

 

日常笔记,组合控件,含自定义属性,别的组合控件原理也差不多,对你们有帮助的希望可以点赞支持,鼓励我一下,给我一个前进的动力。哈哈哈哈哈

 

 

你可能感兴趣的:(Android)