美文网首页
简单标题自定义控件

简单标题自定义控件

作者: 失足者 | 来源:发表于2019-06-01 16:43 被阅读0次

    提高UI布局代码的复用性,与代码高度解耦

    一、创建一个需要自定义的布局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_height="wrap_content"

        android:layout_width="match_parent">

            android:id="@+id/custom_left_btn"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignParentLeft="true"

            android:layout_centerVertical="true"

            android:layout_marginLeft="5dp"

            android:background="@null"

            android:gravity="center"

            android:minHeight="45dp"

            android:minWidth="45dp"

            android:textSize="14sp"

            />

            android:id="@+id/custom_title"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerInParent="true"

            android:gravity="center"

            android:lines="1"

            android:ellipsize="end"

            android:textSize="17sp"/>

            android:id="@+id/custom_right_btn"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:gravity="center"

            android:layout_alignParentRight="true"

            android:layout_centerVertical="true"

            android:layout_marginRight="7dp"

            android:background="@null"

            android:minWidth="45dp"

            android:minHeight="45dp"

            android:textSize="14sp"/>

    </RelativeLayout>

    二、定义自定义需要的属性,在values下创建一个命名为attrs的xml属性文件

    <declare-styleable name="CustomTitleBar">

        <attr name="title_background_color" format="integer|reference"/>

        <attr name="title_text" format="string"/>

        <attr name="title_text_color" format="color"/>

        <attr name="title_text_drawable" format="reference|integer"/>

        <attr name="left_button_text" format="string"/>

        <attr name="left_button_text_color" format="color"/>

        <attr name="left_button_text_drawable" format="reference|integer"/>

        <attr name="right_button_text" format="string"/>

        <attr name="right_button_text_color" format="color"/>

        <attr name="right_button_text_drawable" format="reference|integer"/>

        <attr name="left_button_visible" format="boolean"/>

        <attr name="right_button_visible" format="boolean"/>

    </declare-styleable>

    三、新建类继承一个ViewGroup,设置好相应的属性值。这里继承的是RelativeLayout

    public class CustomTitleBarextends RelativeLayout {

    private ButtoncustomLeftBtn,customRightBtn;

        private TextViewcustomTitle;

        public CustomTitleBar(Context context) {

    super(context);

        }

    /**

    * 在这个构造方法中初始化控件

        * @param context

        * @param attrs

        */

        public CustomTitleBar(Context context, AttributeSet attrs) {

    super(context, attrs);

            //初始化布局和控件

            LayoutInflater.from(context).inflate(R.layout.custom_title_bar,this,true);

            customLeftBtn=findViewById(R.id.custom_left_btn);

            customRightBtn=findViewById(R.id.custom_right_btn);

            customTitle=findViewById(R.id.custom_title);

            //获取属性值数组,将xml设置的属性值绑定

            TypedArray attributes=context.obtainStyledAttributes(attrs,R.styleable.CustomTitleBar);

            Log.i("CustomTitleBar", String.valueOf(attributes!=null));

            //判断属性数组是否为空

            if (attributes!=null){

    //处理titlebar的背景颜色,获取设置的背景颜色,如果没有设置,则默认为绿色

                int titleBarBackground=attributes.getResourceId(R.styleable.CustomTitleBar_title_background_color,Color.GREEN);

                setBackgroundResource(titleBarBackground);//设置titlebar背景颜色

    //从左到右,先处理左边的按钮属性

    //获取是否要显示左边按钮

                boolean customLeftBtnVisible=attributes.getBoolean(R.styleable.CustomTitleBar_left_button_visible,true);

                if (customLeftBtnVisible){

    customLeftBtn.setVisibility(View.VISIBLE);

                }else {

    customLeftBtn.setVisibility(View.GONE);

                }

    //设置左边按钮文字

                String customLeftBtnText=attributes.getString(R.styleable.CustomTitleBar_left_button_text);

                //判断是否有设置文字

                if (!TextUtils.isEmpty(customLeftBtnText)){

    customLeftBtn.setText(customLeftBtnText);

                    //然后再设置文字的颜色

                    int customLeftBtnTextColor=attributes.getColor(R.styleable.CustomTitleBar_left_button_text_color,Color.WHITE);

                    customLeftBtn.setTextColor(customLeftBtnTextColor);

                }else {//如果左边按钮设置的不是文字,那只能设置icon了

    //设置左边图片icon 这里是二选一 要么只能是文字 要么只能是图片

                    int customLeftBtnDrawable=attributes.getResourceId(R.styleable.CustomTitleBar_left_button_text_drawable,R.drawable.titlebar_back);

                    if (customLeftBtnDrawable!=-1){//判断是否有设置图标

                        customLeftBtn.setBackgroundResource(customLeftBtnDrawable);

                    }

    }

    //处理中间的标题TextView

    //先获取标题是否要显示图标icon

                int customTitleDrawable=attributes.getResourceId(R.styleable.CustomTitleBar_title_text_drawable,-1);

                if (customTitleDrawable!=-1){

    customTitle.setBackgroundResource(customTitleDrawable);

                }else{

    //如果没有设置图标,则获取文字标题

                    String customTitleText=attributes.getString(R.styleable.CustomTitleBar_title_text);

                    if (!TextUtils.isEmpty(customTitleText)){

    customTitle.setText(customTitleText);

                    }

    //设置标题字体颜色

                    int customTitleColor=attributes.getColor(R.styleable.CustomTitleBar_title_text_color,Color.WHITE);

                    customTitle.setTextColor(customTitleColor);

                }

    //处理右边按钮

    //判断是否显示右边按钮

                boolean customRightBtnVisible=attributes.getBoolean(R.styleable.CustomTitleBar_right_button_visible,true);

                if (customRightBtnVisible){

    customRightBtn.setVisibility(View.VISIBLE);

                }else {

    customRightBtn.setVisibility(View.GONE);

                }

    //设置右边按钮的文字

                String customRightBtnText=attributes.getString(R.styleable.CustomTitleBar_right_button_text);

                if (!TextUtils.isEmpty(customRightBtnText)){

    customRightBtn.setText(customRightBtnText);

                    //设置文字字体颜色

                    int customRightBtnColor=attributes.getColor(R.styleable.CustomTitleBar_right_button_text_color,Color.WHITE);

                    customRightBtn.setTextColor(customRightBtnColor);

                }else {

    //如果没有设置文字,则设置图片,只有这两个选择

                    int customRightBtnDrawable=attributes.getResourceId(R.styleable.CustomTitleBar_right_button_text_drawable,R.drawable.titlebar_add);

                    if (customRightBtnDrawable!=-1){

    customRightBtn.setBackgroundResource(customRightBtnDrawable);

                    }

    }

    attributes.recycle();//最后得释放内存对象

            }

    }

    //为左右两边的按钮设置点击监听事件

        /**

    * 为左右两边的按钮分别设置点击事件

        * @param onClickListener

        */

        public void setTitleClickListener(OnClickListener onClickListener){

    if (onClickListener!=null){

    customLeftBtn.setOnClickListener(onClickListener);

                customRightBtn.setOnClickListener(onClickListener);

            }

    }

    /**

    * 获得左边按钮

        * @return

        */

        public ButtongetCustomLeftBtn(){

    return customLeftBtn;

        }

    /**

    * 获得右边按钮

    */

        public ButtongetCustomRightBtn(){

    return customRightBtn;

        }

    /**

    * 获得标题文本控件

    */

        public TextViewgetCustomTitle(){

    return customTitle;

        }

    }

    四、最后在需要用到的布局上面设置就行了,这里需要注意的是app自定义属性值的路径:

    xmlns:app="http://schemas.android.com/apk/res-auto",在最外层的布局上得加上这个。

    <com.example.liyun.customtitlebar.CustomTitleBar

        android:id="@+id/toolbar_a"

        android:layout_width="match_parent"

        android:layout_height="?actionBarSize"

        app:left_button_text="返回"

        app:title_background_color="@color/red"

        app:title_text="中间标题1"

        app:right_button_text_drawable="@mipmap/titlebar_right"

        android:layout_marginBottom="5dp"

        />

    到这里一个自定义的标题控件就完成了,还有那些需要注意不对的地方,请指正,谢谢

    相关文章

      网友评论

          本文标题:简单标题自定义控件

          本文链接:https://www.haomeiwen.com/subject/gkdgtctx.html