手撸一个基类通用视图
相信大家项目几乎都会用到标题栏吧?标题栏几乎每个页面都会用到,而标题栏的尺寸也是一致,所以公共的东西,我们要尽量抽取和复用,所以这里我们提取标题栏到基类,让我们继承基类就能自动加载标题栏,同时我们子类又能灵活控制。
标题栏布局文件编写:include_title_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@color/colorPrimary"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:src="@drawable/common_top_back" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="首页"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:text="保存"
android:textColor="@color/white"
android:textSize="12sp" />
</RelativeLayout>
基类布局文件编写:activity_base.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
include_title_bar.xml布局预览:
改造之前的BaseActivity
/**
* Activity基类
* Created by Chao on 2017-12-23.
*/
public abstract class BaseActivity extends AppCompatActivity implements BaseInterFace {
protected Context mContext;
LinearLayout ll_content;
ImageView iv_back;
TextView tv_title;
TextView tv_right;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.activity_base);
ll_content = findViewById(R.id.ll_content);
init();
}
private void init() {
initContent();
FindView.bind(this);
initView();
initData();
initListener();
}
private void initContent() {
LayoutInflater inflater = LayoutInflater.from(mContext);
if (showTitleBar()) {
View titleBar = inflater.inflate(R.layout.include_title_bar, ll_content);
iv_back = titleBar.findViewById(R.id.iv_back);
tv_title = titleBar.findViewById(R.id.tv_title);
tv_right = titleBar.findViewById(R.id.tv_right);
iv_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();//这里复写返回键监听,默认关闭当前页面,免去子类设置监听,麻烦。
}
});
setTitleBar(iv_back, tv_title, tv_right);
}
inflater.inflate(getLayout(), ll_content);
}
@Override
public void initView() {
}
@Override
public void initData() {
}
@Override
public void initListener() {
}
/**
* 是否加载标题栏,子类可复写
*/
protected boolean showTitleBar() {
return true;
}
protected abstract void setTitleBar(ImageView iv_back, TextView tv_title, TextView tv_right);
}
测试:
至此,只要我们继承BaseActivity,就会默认附带标题栏,子类可以复写showTitleBar()控制显示。
@Override
protected boolean showTitleBar() {
return false;
}
在子类设置和显示标题栏内容:
@Override
protected void setTitleBar(ImageView iv_back, TextView tv_title, TextView tv_right) {
tv_title.setText("这是标题");
}
以上三个控件分别代码返回键,标题,右边文本控件,可以随意设置或者GONE。
这会儿有事要出门了,下次继续扩展。
源码地址:https://github.com/zhangzhichaolove/BasicsFrame