一、情形描述
在常使用的页面布局中,为保持用户一贯的使用风格,会保持页面的整体风格相似。除开底部导航外,标题栏是使用频率较高的另一种页面布局。如图所示:
在程序猿“懒惰”的催促下,总是希望能够抽取成为公共的部分,在使用的时候就修改需要修改的地方就行。
二、第一种抽取方法
custom_common_title.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/title_root_group"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@mipmap/head_bar"
android:orientation="horizontal">
<ImageView
android:id="@+id/title_left_iv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@mipmap/back" />
<TextView
android:id="@+id/title_left_tv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="gone" />
<TextView
android:id="@+id/title_name_tv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="6" />
<ImageView
android:id="@+id/title_right_iv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@mipmap/enter"
android:visibility="gone" />
<TextView
android:id="@+id/title_right_tv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
BaseActivity.java
/**
* 功能描述:抽取公共的基础Activity
* <p>
* <p>
* 当前方式标题栏高度不能自由控制【有待于优化】
* 时间:2016/8/9
* 作者:vision
*/
public abstract class BaseActivity extends Activity {
/**
* 标题左边文字栏
*/
private TextView titleLeftTV;
/**
* 标题左边图像栏
*/
private ImageView titleLeftIV;
/**
* 标题标题栏
*/
private TextView titleNameTV;
/**
* 标题右边文字栏
*/
private TextView titleRightTV;
/**
* 标题右边图像栏
*/
private ImageView titleRightIV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void setContentView(int layoutResID) {
View contentView = LayoutInflater.from(this).inflate(layoutResID, null);
setContentView(contentView);
}
@Override
public void setContentView(View view) {
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
setContentView(view, lp);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams lp) {
boolean hasTitle = hasTitle();
if (hasTitle) {
int titleLayoutId = getCustomTitleLayoutId();
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
if (lp == null) {
super.setContentView(view);
} else {
super.setContentView(view, lp);
}
Window w = getWindow();
w.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, titleLayoutId);
Drawable titleBg = getTitleBg();
ViewGroup titleGroup = (ViewGroup) findViewById(R.id.title_root_group);
if (titleBg != null) {
titleGroup.addView(titleGroup, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
} else {
titleGroup.setBackgroundColor(Color.GREEN);
}
initTitle();
} else {
requestWindowFeature(Window.FEATURE_NO_TITLE);
if (lp == null) {
super.setContentView(view);
} else {
super.setContentView(view, lp);
}
}
}
/**
* 初始化View,分三部分:
* Left、Center、Right:可以设置图片、文字、点击事件
*/
private void initTitle() {
titleLeftTV = (TextView) findViewById(R.id.title_left_tv);
titleLeftIV = (ImageView) findViewById(R.id.title_left_iv);
titleNameTV = (TextView) findViewById(R.id.title_name_tv);
titleRightTV = (TextView) findViewById(R.id.title_right_tv);
titleRightIV = (ImageView) findViewById(R.id.title_right_iv);
//下面三个方法根据自己的要求实现;
setTitleLeftView(titleLeftTV, titleLeftIV);
setTitleNameView(titleNameTV);
setTitleRightView(titleRightTV, titleRightIV);
}
/**
* 属性方法形成空实现,子类可重写可不重写
*/
/**
* 设置标题栏右标题属性
*
* @param titleRightTV 右标题栏文字
* @param titleRightIV 右标题栏图像
*/
public void setTitleRightView(TextView titleRightTV, ImageView titleRightIV) {
}
/**
* 设置标题栏属性
*
* @param titleNameTV 标题栏标题信息
*/
public void setTitleNameView(TextView titleNameTV) {
}
/**
* 设置标题栏左标题属性
*
* @param titleLeftTV 左标题文字
* @param titleLeftIV 左标题图像
*/
public void setTitleLeftView(TextView titleLeftTV, ImageView titleLeftIV) {
}
/**
* 是否显示Title,子类可重写
*
* @return
*/
protected boolean hasTitle() {
return true;
}
/**
* Title布局文件;
*
* @return
*/
protected int getCustomTitleLayoutId() {
return R.layout.custom_common_title;
}
/**
* Title背景,子类可以重写;
*
* @return
*/
protected Drawable getTitleBg() {
return null;
}
}
三、第二种抽取方法
head_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@mipmap/head_bar">
<ImageView
android:id="@+id/title_bar_back"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:padding="5dp"
android:src="@drawable/back_select" />
<TextView
android:id="@+id/base_activity_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="方正字体"
android:textColor="#FFFFFF"
android:textSize="22dp" />
<LinearLayout
android:id="@+id/base_activity_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:orientation="horizontal"
android:padding="5dp" />
</RelativeLayout>
</LinearLayout>
NewBaseActivity.java
public abstract class NewBaseActivity extends Activity {
/**
* 标题中部文字描述
*/
private TextView titleText;
/**
* 标题右边View布局
*/
private LinearLayout rightLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
initCreateView();
initView();
initData();
initLitener();
try {
View titlebarView = findViewById(R.id.title_bar_back);
if (titlebarView != null) {
titlebarView.setOnClickListener(new MyBackListener());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private class MyBackListener implements View.OnClickListener {
@Override
public void onClick(View v) {
mySelfDestory();
if (getLeftBtn()) {
Toast.makeText(NewBaseActivity.this, "您点击了返回!", Toast.LENGTH_SHORT).show();
} else {
finish();
}
}
}
/**
* 初始化View
*/
protected void initView() {
//添加右边按钮
rightLayout = (LinearLayout) findViewById(R.id.base_activity_right);
if (getRightBtn() != null) {
rightLayout.addView(getRightBtn());
}
titleText = (TextView) findViewById(R.id.base_activity_title);
if (getTopTitleText() != null) {
titleText.setText(getTopTitleText());
}
}
/**
* 获取右边自定义按钮,由用户自己定义
*
* @return
*/
protected View getRightBtn() {
return null;
}
/**
* 获取顶部标题
*
* @return
*/
public abstract String getTopTitleText();
/**
* 设置布局文件
*/
public abstract void initCreateView();
/**
* 初始化数据
*/
public abstract void initData();
/**
* 初始化监听器
*/
public abstract void initLitener();
/**
* 销毁自我
*/
private void mySelfDestory() {
}
/**
* 是否获取标题左部按钮
*
* @return
*/
protected boolean getLeftBtn() {
return false;
}
}
四、总结
1,展示效果如图
2,说明:
点击确定--点击返回,均是第一种实现的效果。
点击跳转新BaseActivity是第二种实现方式。
很明显的看出第一种实现方式是真的太糙了,第二种方式相对来讲,就是夏日中一泓清泉。
两种方式展示出来,一是为了看到做出的工作,习惯性给自己一点“甜头”;二是给自己挖一个深坑。在前行的路上,我还有很多东西需要学习、研究。也正是一个个坑的天平逐步让自己强壮一点点。
给大家推荐第二种,如果你看到,你用就好。要是你喜欢研究,欢迎你来填坑。
第一种方式的坑就是:返回或者确定,使用切图展示效果很差;整个头部布局的高度不能自由控制。
上班睡觉被抓
“老板,非是本人怠惰因循,实在是这段代码深奥无比。Do与While之间相互勾连,互成太极之势,循环不尽。按照其中指示运行,才发现错误层出不穷。定睛细看,又觉此中分支繁多,仿佛包含所有BUG,各个BUG之间又互成掎角之势。一旦沉迷其中,让人欲昏欲睡,欲仙欲死,几欲脱离红尘,遁入空门。才钻研一根烟的时间,我已心力交瘁,还好香烟燃至食指,才将我惊醒,否则定会耗尽心力而亡。为了避免公司遭受逼死员工的骂名,我才稍息片刻。”
----- 做一个小小的二货