在日常的开发当中,经常会用到 Toolbar 作为标题栏,如果在每个 view 里面都写一个 Toolbar 的话,显然有点冗余,一般情况下在每个项目里面都有一个 BaseActivity,作为所有 Activity 的父类,我们就可以在 BaseActivity 中封装好 Toolbar,在子类用 BaseActivity 提供的方法调用即可。
来来来,往这边看,下面的的 gif 都是通过一个 Toolbar 实现的:
是不是很不错,只用在子 Activity 中调用 BaseActivity 中的方法或者重写方法就可以了。有兴趣的可以看下代码,欢迎指正
先在 BaseActivity 中写好布局文件,一个 Toolbar 和一个 RelativeLayout:
- <?
- xml version=
- "1.0"
- encoding=
- "utf-8"
- ?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_base"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context="com.sean.demo.ui.BaseActivity">
- <android.support.v7.widget.Toolbar
- android:id="@+id/common_title_tb"
- android:layout_width="match_parent"
- android:layout_height="@dimen/common_toolbar_height"
- android:background="@color/colorPrimary"
- android:elevation="6dp">
- <TextView
- android:id="@+id/common_title_tv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="我是标题"
- android:textColor="@color/white"
- android:textSize="16sp" />
- </android.support.v7.widget.Toolbar>
- <RelativeLayout
- android:id="@+id/content"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"></RelativeLayout>
- </LinearLayout>
然后我们需要在 BaseActivity 中暴露给子类特定的方法,让子类去根据自己的实际情况去定制页面。
主要方法有:
给 Toolbar 的 menu 设置点击事件,满足不同页面的需求
- setToolBarMenuOnclick
代码:
- public class BaseActivity extends AppCompatActivity {
- /**
- * 通用的ToolBar标题
- */
- private TextView commonTitleTv;
- /**
- * 通用的ToolBar
- */
- private Toolbar commonTitleTb;
- /**
- * 内容区域
- */
- private RelativeLayout content;
- @Override protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_base);
- initView();
- setSupportActionBar(commonTitleTb);
- getSupportActionBar().setDisplayShowTitleEnabled(false);
- }
- private void initView() {
- commonTitleTv = (TextView) findViewById(R.id.common_title_tv);
- commonTitleTb = (Toolbar) findViewById(R.id.common_title_tb);
- content = (RelativeLayout) findViewById(R.id.content);
- }
- /**
- * 子类调用,重新设置Toolbar
- *
- * @param layout
- */
- public void setToolBar(int layout) {
- hidetoolBar();
- commonTitleTb = (Toolbar) content.findViewById(layout);
- setSupportActionBar(commonTitleTb);
- //设置actionBar的标题是否显示,对应ActionBar.DISPLAY_SHOW_TITLE。
- getSupportActionBar().setDisplayShowTitleEnabled(false);
- }
- /**
- * 隐藏ToolBar,通过setToolBar重新定制ToolBar
- */
- public void hidetoolBar() {
- commonTitleTb.setVisibility(View.GONE);
- }
- /**
- * menu的点击事件
- *
- * @param onclick
- */
- public void setToolBarMenuOnclick(Toolbar.OnMenuItemClickListener onclick) {
- commonTitleTb.setOnMenuItemClickListener(onclick);
- }
- /**
- * 设置左上角back按钮
- */
- public void setBackArrow() {
- final Drawable upArrow = getResources().getDrawable(R.drawable.common_back_ic);
- //给ToolBar设置左侧的图标
- getSupportActionBar().setHomeAsUpIndicator(upArrow);
- // 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- //设置返回按钮的点击事件
- commonTitleTb.setNavigationOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {
- finish();
- }
- });
- }
- /**
- * 设置toolbar下面内容区域的内容
- *
- * @param layoutId
- */
- public void setContentLayout(int layoutId) {
- LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View contentView = inflater.inflate(layoutId, null);
- ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
- content.addView(contentView, params);
- }
- /**
- * 设置标题
- *
- * @param title
- */
- public void setTitle(String title) {
- if (!TextUtils.isEmpty(title)) {
- commonTitleTv.setText(title);
- }
- }
- /**
- * 设置标题
- *
- * @param resId
- */
- public void setTitle(int resId) {
- commonTitleTv.setText(resId);
- }
- }
比如你想在上面 gif 图的 EventBusActivity 的 Activity 使用,并且实现 menu 点击事件、返回按钮、设置标题等操作,只需要下面很简单的代码就可以了:
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentLayout(R.layout.activity_event_bus);//设置到BaseActivity中的content中
- setTitle("EventBus使用");//设置标题
- setBackArrow();//设置返回按钮和点击事件
- setToolBarMenuOnclick(new EventBusMenuItemClick());//设置menu菜单的显示和点击事件
- }
各位看官感兴趣的话,欢迎去看看, 这里是地址 ,有什么可以修改的,欢迎提出宝贵意见!
来源: https://juejin.im/post/5a39e33d51882512ae12cb49