Android标题栏的封装TitleBar

来源:互联网 发布:javascript pop() 编辑:程序博客网 时间:2024/05/06 21:16

在开发中,如果我们不想要系统的标题栏,而是想要自己定义状态栏的话,就需要自定义布局,或者,每写一个activity,其对应的页面就要写一次标题栏的布局,那么,而且还要在activity中设置标题栏的值。
那为什么不把设置值封装一下,动态的去设置标题栏上的内容。
标题栏无非就是返回按钮,标题,还有右侧的选项,那么,我们先来写一个布局,高度我们给60dp,里面有什么呢:

 1. 返回按钮 2. 返回按钮后面的文字(有时候不需要) 3. 标题 4. 右侧的图标或者文字

如果不是特殊情况需要增加别的东西,就是这么多了;
来看一下布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/ll_title_bar"    android:paddingTop="10dp"    android:background="@color/bg_color2"    android:gravity="center_vertical"    android:layout_width="match_parent"    android:layout_height="60dp">    <RelativeLayout        android:id="@+id/rl_title_bar"        android:gravity="center_vertical"        android:layout_width="match_parent"        android:layout_height="match_parent">    //返回箭头        <ImageView            android:id="@+id/iv_left_icon"            android:layout_centerVertical="true"            android:scaleType="centerCrop"            android:src="@drawable/ic_back_selector"            android:layout_width="11dp"            android:layout_height="22dp" />    //标题        <TextView            android:id="@+id/tv_title_middle"            android:textSize="@dimen/scu_tv_size3"            android:textColor="@color/btn_blue"            android:layout_centerInParent="true"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />    //右侧图标        <ImageView            android:visibility="gone"            android:layout_centerVertical="true"            android:id="@+id/iv_rightIco"            android:layout_alignParentRight="true"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />            //右侧文字        <TextView            android:visibility="gone"            android:id="@+id/tv_title_right"            android:textSize="@dimen/scu_tv_size3"            android:gravity="center_vertical"            android:layout_alignParentRight="true"            android:layout_width="wrap_content"            android:layout_height="match_parent" />    </RelativeLayout></LinearLayout>

布局里面含有:左边的返回箭头,中间的标题,右侧图标和文字(二者同时出现其中一个).
布局写好了,那么在activity中如何使用呢,如果按照一贯的写法,肯定每个activity中都要写繁琐的设置标题栏代码,那就封装一下:

public class TitleBar {    /**     * 左侧/右侧图标和中间标题     */    private View titleView;    /**     * 左侧/右侧图标和中间标题     */    private RelativeLayout rl_title_bar;    /**     * 跟布局     */    private LinearLayout ll_title_bar;    /**     * 左侧图标     */    private ImageView iv_left_icon;    /**     * 右侧图标     */    private ImageView iv_rightIco;    /**     * 中间标题     */    private TextView tv_title_middle;    /**     * 右侧标题     */    private TextView tv_title_right;    /**     * 构造方法:用于获取对象     * */    public TitleBar(Activity context){        titleView = context.findViewById(R.id.rl_title_bar);        rl_title_bar = (RelativeLayout)titleView.findViewById(R.id.rl_title_bar);        ll_title_bar = (LinearLayout) context.findViewById(R.id.ll_title_bar);        tv_title_middle = (TextView)titleView.findViewById(R.id.tv_title_middle);        tv_title_right = (TextView)titleView.findViewById(R.id.tv_title_right);        iv_left_icon = (ImageView)titleView.findViewById(R.id.iv_left_icon);        iv_rightIco = (ImageView)titleView.findViewById(R.id.iv_rightIco);    }    /**     * 用于设置标题栏文字     * @param titleText  传入要设置的标题     * @return     */    public TitleBar setTitleText(String titleText){        if(!StringUtils.isNull(titleText)){            tv_title_middle.setText(titleText);        }        return this;    }    /**     * 设置标题栏文字颜色     * @return     */    public TitleBar setTitleTextColor(){        tv_title_middle.setTextColor(Color.WHITE);        return this;    }    /**     * 设置标题栏右边的文字     * @return     */    public TitleBar setTitleRight(String rightTitle){        if(!StringUtils.isNull(rightTitle)){            tv_title_right.setVisibility(View.VISIBLE);            iv_rightIco.setVisibility(View.GONE);            tv_title_right.setTextColor(Color.WHITE);            tv_title_right.setText(rightTitle);        }        return this;    }    /**     * 用于设置标题栏左边要显示的图片     * @param resId  标题栏左边的图标的id,一般为返回图标     * @return     */    public TitleBar setLeftIco(int resId){        iv_left_icon.setVisibility(resId > 0 ? View.VISIBLE : View.GONE);        iv_left_icon.setImageResource(resId);        return this;    }    /**     * 用于设置标题栏右边要显示的图片     * @param resId 标题栏右边的图标id     * @return     */    public TitleBar setRightIco(int resId){        iv_rightIco.setVisibility(resId > 0 ? View.VISIBLE : View.GONE);        iv_rightIco.setImageResource(resId);        return this;    }    /**     * 用户设置 标题栏右侧的图标的背景drawable     * @param resId  drawable的id     * @return     */    public TitleBar setRightIconBgDr(int resId){        iv_rightIco.setVisibility(resId > 0 ? View.VISIBLE : View.GONE);        iv_rightIco.setImageResource(R.drawable.ic_back_selector);        return this;    }    /**     * 用于设置标题栏左边图片的单击事件     * @param listener 传入的事件对象     * @return     */    public TitleBar setLeftIcoListening(View.OnClickListener listener){        if(iv_left_icon.getVisibility() == View.VISIBLE){            iv_left_icon.setOnClickListener(listener);        }        return this;    }    /**     * 用于设置标题栏右边图片的单击事件     * @param listener  传入的事件对象     * @return     */    public TitleBar setRightIcoListening(View.OnClickListener listener){        if(iv_rightIco.getVisibility() == View.VISIBLE){            iv_rightIco.setOnClickListener(listener);        }        return this;    }}

我们把可能需要的设置,都封装到一个类中,比如设置左边的箭头、设置标题文字、设置右侧图标和文字。
这样的话,我们在activity中就不需要在找到这个控件,以为已经封装起来了,既然已经封装好了,怎么使用呢:

 new TitleBar(this).setLeftIco(R.mipmap.ic_back_white).setTitleText("设置").setTitleRight("右侧").setLeftIcoListening(new View.OnClickListener() {            @Override            public void onClick(View v) {            }        }).setRightIcoListening(new View.OnClickListener() {            @Override            public void onClick(View v) {            }        });

在activity初始化时,同时初始化标题栏,这样就可以了,别忘了,每个页面都要添加标题栏布局,使用:

<include layout="@layout/ll_toolbar"/>

因为封装的类中要找到每个控件,所以需要标题栏的每个页面中都要添加标题栏布局。

0 0