Android ToolBar 的简单封装

智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述Android ToolBar 的简单封装相关的知识,希望能为你提供帮助。
使用过 ToolBar 的朋友肯定对其使用方法不陌生,由于其使用方法非常easy。假设对 ActionBar 使用比較熟练的人来说。ToolBar 就更easy了!只是,相信大家在使用的过程中都遇到过这样一个问题,须要在每个我们要使用的 xml 中加入 ToolBar 这个控件,比方我须要在 MainActivity中使用 ToolBar,则他的 xml 文件须要这样写,

< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"> < android.support.v7.widget.Toolbar android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" android:id="@+id/id_tool_bar" android:background="?attr/colorPrimary" app:navigationIcon="?attr/homeAsUpIndicator" > < /android.support.v7.widget.Toolbar> < TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asdfasf" android:layout_alignParentBottom="true"/> < /RelativeLayout>

同理其它 Activity 中须要用页都须要在 xml加入
< android.support.v7.widget.Toolbar android:layout_height="?
attr/actionBarSize" android:layout_width="match_parent" android:id="@+id/id_tool_bar" android:background="?attr/colorPrimary" app:navigationIcon="?attr/homeAsUpIndicator" > < /android.support.v7.widget.Toolbar>

这样一段代码,尽管不多。可是我们最烦的就是写反复代码,也不符合我们的编程思想;所以就有了下面写法
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"> < include layout="@layout/toolbar" android:layout_width="match_parent" android:layout_height="?
【Android ToolBar 的简单封装】attr/actionBarSize" /> < TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asdfasf" android:layout_alignParentBottom="true"/> < /RelativeLayout>

toolbar.xml的代码例如以下
< ?xml version="1.0" encoding="utf-8"?> < FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> < android.support.v7.widget.Toolbar android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" android:id="@+id/id_tool_bar" android:background="?attr/colorPrimary" app:navigationIcon="?
attr/homeAsUpIndicator" > < /android.support.v7.widget.Toolbar> < /FrameLayout>

这样我们仅仅须要在每个我们要使用 toolbar 的 xml 中通过 include 嵌入 toolbar.xml布局即可,感觉和之前的比,确实是少了几行代码!可是意义不大。
而我这里要实现的封装。是能够不须要在 xml 中写一行关于 toolbar 的代码,也就是跟平时不用 toolbar 一样的写法即可!请接着往下看。

前提是准备好toolbar.xml,ToolBarActivity.java,ToolBarHelper.java
toolbar.xml中配置 toolbar 的基本属性:
toolbar 的宽高,toolbar 的背景颜色等其它样式
ToolBarActivity.java是所以须要使用 toolbar Activity 的父类,这里我把他定义为抽象类,由于单独的这个类不能完毕不论什么功能
ToolBarHelper.java 是 Activity 和 toolbar 的关联类
先来看 toolbar.xml的代码
< ?xml version="1.0" encoding="utf-8"?> < FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> < android.support.v7.widget.Toolbar 设置高度为 ActionBar 的高度 android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" android:id="@+id/id_tool_bar" 背景颜色为 ActionBar 的背景颜色 android:background="?
attr/colorPrimary" 返回button的图标 app:navigationIcon="?attr/homeAsUpIndicator" > < /android.support.v7.widget.Toolbar> < /FrameLayout>

ToolBarActivity.java的内容:主要代码是在setContentView(int id) 实现
package toolbar.toolbar; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; /** * Created by moon.zhong on 2015/6/12. * time : 10:26 */ public abstract class ToolBarActivity extends AppCompatActivity { private ToolBarHelper mToolBarHelper ; public Toolbar toolbar ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }@Override public void setContentView(int layoutResID) {mToolBarHelper = new ToolBarHelper(this,layoutResID) ; toolbar = mToolBarHelper.getToolBar() ; setContentView(mToolBarHelper.getContentView()); /*把 toolbar 设置到Activity 中*/ setSupportActionBar(toolbar); /*自己定义的一些操作*/ onCreateCustomToolBar(toolbar) ; }public void onCreateCustomToolBar(Toolbar toolbar){ toolbar.setContentInsetsRelative(0,0); }@Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home){ finish(); return true ; } return super.onOptionsItemSelected(item); } }

ToolBarHelper.java
这个类的功能是:先创建一个 ViewGroup 来作为视图的父 View,把用户定义的 View。和 toolBar 依次 Add 到 ViewGroup 中;
package toolbar.toolbar; import android.content.Context; import android.content.res.TypedArray; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; /** * Created by moon.zhong on 2015/6/12. * time : 10:45 */ public class ToolBarHelper {/*上下文,创建view的时候须要用到*/ private Context mContext; /*base view*/ private FrameLayout mContentView; /*用户定义的view*/ private View mUserView; /*toolbar*/ private Toolbar mToolBar; /*视图构造器*/ private LayoutInflater mInflater; /* * 两个属性 * 1、toolbar是否悬浮在窗体之上 * 2、toolbar的高度获取 * */ private static int[] ATTRS = { R.attr.windowActionBarOverlay, R.attr.actionBarSize }; public ToolBarHelper(Context context, int layoutId) { this.mContext = context; mInflater = LayoutInflater.from(mContext); /*初始化整个内容*/ initContentView(); /*初始化用户定义的布局*/ initUserView(layoutId); /*初始化toolbar*/ initToolBar(); }private void initContentView() { /*直接创建一个帧布局,作为视图容器的父容器*/ mContentView = new FrameLayout(mContext); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mContentView.setLayoutParams(params); }private void initToolBar() { /*通过inflater获取toolbar的布局文件*/ View toolbar = mInflater.inflate(R.layout.toolbar, mContentView); mToolBar = (Toolbar) toolbar.findViewById(R.id.id_tool_bar); }private void initUserView(int id) { mUserView = mInflater.inflate(id, null); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); TypedArray typedArray = mContext.getTheme().obtainStyledAttributes(ATTRS); /*获取主题中定义的悬浮标志*/ boolean overly = typedArray.getBoolean(0, false); /*获取主题中定义的toolbar的高度*/ int toolBarSize = (int) typedArray.getDimension(1,(int) mContext.getResources().getDimension(R.dimen.abc_action_bar_default_height_material)); typedArray.recycle(); /*假设是悬浮状态,则不须要设置间距*/ params.topMargin = overly ? 0 : toolBarSize; mContentView.addView(mUserView, params); }public FrameLayout getContentView() { return mContentView; }public Toolbar getToolBar() { return mToolBar; } }

到这里,toolbar 的简单封装就算完毕了。一起来看看封装之后的效果吧
MainActivity.java
package toolbar.toolbar; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ToolBarActivity {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }}

activity_main.xml
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"> < TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asdfasf" android:layout_alignParentBottom="true"/> < /RelativeLayout>

到这里我们无论是 MainActivity 还是 activity_main中都没有出现 ToolBar,仅仅是 MainActivity 不再继承 AppCompatActivity。而是继承我们 ToolBarActivity,执行效果看看:
Android ToolBar 的简单封装

文章图片

ToolBar 的其它使用方法这里就不讲了,跟 ActionBar 使用方法差点儿一样。
最后:
在使用 ToolBar 的时候,须要使用无 ActionBar 的主题,
< !-- Base application theme. --> < style name="AppThemeParent" parent="Theme.AppCompat.NoActionBar"> < !-- Customize your theme here. --> < item name="colorPrimary"> @android:color/holo_red_light< /item> < /style>

再上一张自己定义 View 的 ToolBar 效果图:
标题居中,右側能够加入button
Android ToolBar 的简单封装

文章图片

源代码下载











    推荐阅读