Android标题栏的封装TitleBar

在开发中,如果我们不想要系统的标题栏,而是想要自己定义状态栏的话,就需要自定义布局,或者,每写一个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"/>

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值