Toolbar是我们最常用的一个控件,几乎每一个activity都要用到,如果我们每一个界面都要去加一个toolbar然后再去findviewbyid,而且toolbar上的设置可能很activity都是相同的,那代码会不会很多重复呢?
下面就根据android界面构架的思想,自己去封装一个toolbar到BaseActivity上,其它activity只要继承BaseActivity并重写它的方法就能设置ToolBar的相关属性了。
下面先看一下效果图
先看一下android界面的构架图吧
每个activity下都有一个LinearLayout(DecorWindow)装载着一个titleView和一个ContentView,其实这个titleView就是我们的actionBar,所以要使用ToolBar必须设置主题为NoActionBar,我们在activity里面调用setContentView这个方法其实就是把我们的布局加到ContentView里面。
现在思路就很清晰了,开始用上面的这种思想来封装ToolBar
首先先准备一个toolbar_item.xml的布局文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:background="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
</android.support.v7.widget.Toolbar>
</FrameLayout>
开始BaseActivity的代码编写:
先加入几个全局变量
private Toolbar mtoolBar;
private LinearLayout mDectorView = null;//根布局
private FrameLayout mContentView = null;//activity内容布局
重写setContentView方法,把子activity的布局加入到mContentView里面,如下:
/**
* 重写setContentView方法,使mContentView成为子activity界 面的父布局
* @param layoutResID
*/
@Override
public void setContentView(@LayoutRes int layoutResID) {
getLayoutInflater().inflate(layoutResID,mContentView);
super.setContentView(mDectorView);
}
加载toolbar的布局,代码如下:
/**
* 初始化toolbar
*/
private void initToolBar() {
View view = getLayoutInflater().inflate(R.layout.toolbar_item,mDectorView);
mtoolBar = (Toolbar) view.findViewById(R.id.toolbar);
mtoolBar.setTitleTextColor(Color.parseColor("#ffffff"));
setCustomToolbar(mtoolBar);//让activity自己设置toolbar
}
提供一个方法让子activity设置toolbar,如下:
/**
* 让子activity自己定义toolbar
* @param mtoolBar
*/
protected void setCustomToolbar(Toolbar mtoolBar) {
}
然后把toolbar和mContentView都加到根布局mDectorView里面,代码如下:
/**
* 初始化根布局
*/
private void initDectorView() {
mDectorView = new LinearLayout(this);
mDectorView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mDectorView.setOrientation(LinearLayout.VERTICAL);
initToolBar();
mContentView = new FrameLayout(this);
mContentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mDectorView.addView(mContentView);
}
完整的BaseActivity代码如下:
public class BaseAppCompatActivity extends AppCompatActivity {
private Toolbar mtoolBar;
private LinearLayout mDectorView = null;//根布局
private FrameLayout mContentView = null;//activity内容布局
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mDectorView == null)
{
initDectorView();
}
setSupportActionBar(mtoolBar);
//如果已经创建就先把内容清空,再添加
if (mContentView != null) {
mContentView.removeAllViews();
}
}
/**
* 重写setContentView方法,使mContentView成为子activity界面的父布局
* @param layoutResID
*/
@Override
public void setContentView(@LayoutRes int layoutResID) {
getLayoutInflater().inflate(layoutResID,mContentView);
super.setContentView(mDectorView);
}
/**
* 初始化toolbar
*/
private void initToolBar() {
View view = getLayoutInflater().inflate(R.layout.toolbar_item,mDectorView);
mtoolBar = (Toolbar) view.findViewById(R.id.toolbar);
mtoolBar.setTitleTextColor(Color.parseColor("#ffffff"));
setCustomToolbar(mtoolBar);
}
/**
* 让子activity自己定义toolbar
* @param mtoolBar
*/
protected void setCustomToolbar(Toolbar mtoolBar) {
}
/**
* 初始化根布局
*/
private void initDectorView() {
mDectorView = new LinearLayout(this);
mDectorView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mDectorView.setOrientation(LinearLayout.VERTICAL);
initToolBar();
mContentView = new FrameLayout(this);
mContentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mDectorView.addView(mContentView);
}
}
然后用一个activity去继承它,代码如下:
public class TestBaseActivity extends BaseAppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testbase);
}
@Override
protected void setCustomToolbar(Toolbar mtoolBar) {
super.setCustomToolbar(mtoolBar);
//mtoolBar.setNavigationIcon(); 设置返回图标
//mtoolBar.setSubtitle();设置子标题
mtoolBar.setTitle("测试");//设置标题
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_item,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
System.out.println("click:"+item.getTitle());
switch (item.getItemId()) {
case R.id.item1:
Toast.makeText(TestBaseActivity.this, "click item 1", Toast.LENGTH_SHORT).show();
break;
case R.id.item2:
Toast.makeText(TestBaseActivity.this, "click item 2", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
可以自己在baseActivity里面再加其它的基础操作,比如在activity的生命周期回调方法里面做一些每个activity都要做的操作。