带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都要做的操作。
- 带ToolBar的BaseActivity
- AppCompatActivity与toolbar的结合,封装BaseActivity
- BaseActivity 和 ToolBar 的完美结合
- BaseActivity中封装通用的Toolbar
- BaseActivity中封装通用的Toolbar
- baseactivity实现封装toolbar
- 两种构建具有ToolBar的BaseActivity的方式
- BaseActivity中默认添加ToolBar
- android 控件 toolbar BaseActivity集成toolbar
- 懒惰的自己,自带标题栏的BaseActivity
- 封装一个带toolbar的活动,toolbar只写一次
- 关于BaseActivity的用法
- BaseActivity的应用
- BaseActivity的重要性
- 定制自己的BaseActivity
- 自定义的BaseActivity
- 我常用的BaseActivity
- BaseActivity的作用
- JVM 符号引用
- 【LeetCode-66】Plus One(C++)
- 学习笔记--分页机制
- 高仿知乎项目制作流程详解------------第一解:自定义组件的使用
- 简单的大小写字母转换-循环
- 带ToolBar的BaseActivity
- ionic-开发跨平台app的基本问题及解决方案
- JZOJ3052. 【NOIP2012模拟10.25】剪草
- Hadoop-2.6.0伪分布--安装配置hbase-0.99
- 操作系统--分页机制的演示
- StringUtils的isBlank与isEmply 区别
- Androidstudio插件管理
- centos下遇见unzip命令错误及解决
- iOS支付