带ToolBar的BaseActivity

来源:互联网 发布:优惠券淘宝群怎么赚钱 编辑:程序博客网 时间:2024/05/10 04:51

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 */@Overridepublic 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内容布局@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    if (mDectorView == null)    {        initDectorView();    }    setSupportActionBar(mtoolBar);    //如果已经创建就先把内容清空,再添加    if (mContentView != null) {        mContentView.removeAllViews();    }}/** *  重写setContentView方法,使mContentView成为子activity界面的父布局 * @param layoutResID */@Overridepublic 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 {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_testbase);}@Overrideprotected void setCustomToolbar(Toolbar mtoolBar) {    super.setCustomToolbar(mtoolBar);    //mtoolBar.setNavigationIcon(); 设置返回图标    //mtoolBar.setSubtitle();设置子标题    mtoolBar.setTitle("测试");//设置标题       }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    getMenuInflater().inflate(R.menu.toolbar_item,menu);    return super.onCreateOptionsMenu(menu);}@Overridepublic 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都要做的操作。

0 0
原创粉丝点击