这一篇呢,我们就接着上一篇继续,给大家介绍下在BaseActivity中如何集成Toolbar的功能。本文主要介绍两种方法,一种是BaseActivity中不包含布局文件的,一种是BaseActivity中包含布局文件的
(一)BaseActivity中不包含布局文件
1、编写Toolbar的xml布局文件
内容详见上一篇 Materail Design 入门(四)——Toolbar的使用方法(1)
2、在需要Toolbar的地方,通过将Toolbar的布局引入
3、创建BaseActivity并初始化Toolbar,同时提供Toolbar的操作方法
public abstract class BaseToolbarActivity extends AppCompatActivity{
private Toolbar mToolbar;
private TextView mTitle;
private ImageView mRightImg;
private TextView mRightTv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mTitle = (TextView) findViewById(R.id.toolbar_title_layout_title);
mRightImg = (ImageView) findViewById(R.id.toolbar_title_layout_right_iv);
mRightTv = (TextView) findViewById(R.id.toolbar_title_layout_right_tv);
if (mToolbar != null) {
setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}
@Override
protected void onStart() {
super.onStart();
/**
* 判断是否有Toolbar,并默认显示返回按钮
*/
if (null != getToolbar() && isShowBacking()) {
showBack();
}
}
/**
* this Activity of tool bar.
* 获取头部.
*
* @return support.v7.widget.Toolbar.
*/
public Toolbar getToolbar() {
return (Toolbar) findViewById(R.id.toolbar);
}
/**
* 本号小于21的后退按钮图片
*/
private void showBack() {
//setNavigationIcon必须在setSupportActionBar(toolbar);方法后面加入
getToolbar().setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
/**
* 是否显示后退按钮,默认显示,可在子类重写该方法.
*
* @return
*/
protected boolean isShowBacking() {
return true;
}
public void setTitle(String title) {
mTitle.setText(title);
}
public void setRightContent(boolean showRightImg, int imgId, boolean showRightTv, int
contentId) {
if (showRightImg) {
mRightImg.setVisibility(View.VISIBLE);
mRightImg.setImageResource(imgId);
} else {
mRightImg.setVisibility(View.GONE);
}
if (showRightTv) {
mRightTv.setVisibility(View.VISIBLE);
mRightTv.setText(getString(contentId));
} else {
mRightTv.setVisibility(View.GONE);
}
}
public abstract int getLayoutId();
}
BaseActivity中提供了一些Toolbar的操作方法,比如返回键的响应,设置右边 图片和文字,设置标题内容等,通常情况下,我们只设置标题和右边的图片文字即可,返回键的事件 不用另做处理,如果Activity在点击back键要先进行一些判断再关闭,比如说,弹出一个对话框,提示用户是否真的要关闭当前页面,这时我们需要在BaseActivity中再添加一个重载的back方法。
(二)BaseActivity中包含布局文件
1,编写ToolBar布局文件
内容详见上一篇 Materail Design 入门(四)——Toolbar的使用方法(1)
2、初始化根布局
private void initDecorView() {
mDecorView = new LinearLayout(this);
mDecorView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams
.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
mDecorView.setOrientation(LinearLayout.VERTICAL);
addToolbar();
mContentView = new FrameLayout(this);
mContentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams
.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
mDecorView.addView(mContentView);
}
3、重写setContentView,把子布局添加进根布局
getLayoutInflater().inflate(layoutId, mContentView);
super.setContentView(mDecorView);
4、Toolbar的公共方法
public Toolbar getToolbar() {
return mToolbar;
}
public void initToolbar(Toolbar toolbar) {
//toolbar.setTitle("Toolbar");
//toolbar.setLogo(R.mipmap.ic_launcher);
toolbar.setNavigationIcon(R.drawable.img_back_white);
}
代码完整版如下:
public abstract class BaseActivity extends AppCompatActivity {
private LinearLayout mDecorView;
private Toolbar mToolbar;
private FrameLayout mContentView;
/**
* 初始化根布局
*/
private void initDecorView() {
mDecorView = new LinearLayout(this);
mDecorView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams
.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
mDecorView.setOrientation(LinearLayout.VERTICAL);
addToolbar();
mContentView = new FrameLayout(this);
mContentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams
.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
mDecorView.addView(mContentView);
}
/**
* 添加Toolbar
*/
private void addToolbar() {
View view = getLayoutInflater().inflate(R.layout.toolbar, mDecorView);
mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
}
public void setContentView(int layoutId) {
getLayoutInflater().inflate(layoutId, mContentView);
super.setContentView(mDecorView);
}
public Toolbar getToolbar() {
return mToolbar;
}
public void initToolbar(Toolbar toolbar) {
//toolbar.setTitle("Toolbar");
//toolbar.setLogo(R.mipmap.ic_launcher);
toolbar.setNavigationIcon(R.drawable.img_back_white);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mDecorView == null) {
initDecorView();
}
//如果已经创建就先把内容清空,再添加
if (mContentView.getChildCount() != 0) {
mContentView.removeAllViews();
}
setContentView(getLayoutId());
//布局渲染完了之后,才能setSupportActionBar
setSupportActionBar(mToolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null){
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
}
initToolbar(getToolbar());
}
public abstract int getLayoutId();
}
好了到此,Toolbar的用法就基本结束了,有什么疑问多多交流。
切记,这个例子中子类继承BaseActivity之后一定不能再写setContentView()了,这样会覆盖BaseActivity中的view的。