带ToolBar的BaseActivity

本文介绍如何在Android应用中封装自定义Toolbar,通过继承BaseActivity减少重复代码,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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都要做的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值