在开发中,如果我们不想要系统的标题栏,而是想要自己定义状态栏的话,就需要自定义布局,或者,每写一个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"/>
因为封装的类中要找到每个控件,所以需要标题栏的每个页面中都要添加标题栏布局。