实现ToolBar的封装
1.更改主题
在Value文件夹中的style文件里修改主题为
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
2.创建一个帮助类,在该类中实现ToolBar的封装
import android.content.Context;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
/**
* Created by hatsune39 on 2016/12/12.
* function:Toolbar的帮助类,把它做好后就不用做大修改,直接用即可
*/
public class ToolBarHelp {
//ToolBar帮助类的构造方法,方便用户自定义ToolBar,进行对象的初始化
//layoutID:布局资源,context:上下文
//上下文,把一个Xml布局资源转换成View的时候用到
private Context context;
//布局资源
private FrameLayout contextView;
//打气筒,为了转换成View对象
private final LayoutInflater inflater;
//用户传入的XML资源对象
private View userView;
//Toolbar的对象,通过getToolBar获取
private Toolbar toolbar;
public ToolBarHelp(Context context,int layoutID) {
//传递上下文
this.context = context;
//因为普通类没有getInflater()方法可以调用,所以传递一个上下文,通过Layout.from()静态方法得到LayoutInfater的一个对象
inflater = LayoutInflater.from(context);
//初始化整个内容
initContextView();
//初始化用户自定义布局
initUserView(layoutID);
//初始化ToolBar对象
initToolBar();
}
/**
* 初始化整个布局内容
*/
public void initContextView() {
//创建一个布局作为视图的容器,视图容器的父容器
contextView = new FrameLayout(context);
//设置参数对象,定义宽高都是填充父窗体,
//ctrl+q
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
//把参数对象传递给视图容器
contextView.setLayoutParams(params);
}
//初始化用户自定义的布局
private void initUserView(int layoutID) {
//把用户传递过来的XML布局资源转化为一个View对象
userView = inflater.inflate(layoutID, null);
//设置参数对象,定义宽高都是填充父窗体
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
//把参数对象传递给视图容器
userView.setLayoutParams(params);
}
private void initToolBar() {
//把一个装有ToolBar的布局资源转换为一个View对象
View inflate = inflater.inflate(R.layout.activity_tool_bar, contextView);
//找到布局XML资源里的ToolBar,设置为全局变量
toolbar = (Toolbar) inflate.findViewById(R.id.toolbar);
}
/**
* 返回ToolBar的对象,方便用户对ToolBar的自定义
* @return
*/
public Toolbar getToolBar(){
return toolbar;
}
/**
* 获取默认的根布局对象,FrameLayout
*/
public FrameLayout getContextView(){
return contextView;
}
}
3.创建一个ToolBar基类,哪个Activity有ToolBar,就继承该类
import android.support.annotation.LayoutRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
//自定义toolBar的Activity,那个Activity有ToolBar,就继承该类
public class ToolBarActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_bar_tool);
//把加载布局的方法进行重写
}
//进行布局加载方法的复写
@Override
public void setContentView(@LayoutRes int layoutResID) {
super.setContentView(layoutResID);
//创建ToolBarHelp对象,传递参数,1.上下文 2.布局资源(就由继承ToolBarActivity的Activity去写)
ToolBarHelp toolBarHelp = new ToolBarHelp(this, layoutResID);
//获取封装好的ToolBar对象
Toolbar toolBar = toolBarHelp.getToolBar();
//设置ToolBarhelp类中默认指定的根容器
setContentView(toolBarHelp.getContextView());
//设置支持ToolBar
setSupportActionBar(toolBar);
//自定义一些ToolBar的个性化设置
onCreateCustomToolbar(toolBar);
}
/**
* 自定义一些ToolBar的个性设置,继承的Activity记得要对它进行复写
* @param toolBar
*/
public void onCreateCustomToolbar(Toolbar toolBar) {
}
//当用户点击菜单栏中的某一个选项时,会调用该方法,重写此方法,当点击左上方图标时,关闭Activity
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home){
finish();
return true;
}
return super.onContextItemSelected(item);
}
}
布局文件中声明一个ToolBar,设置ID与Background即可.
4.使用封装好的ToolBar
package com.zhiyuan3g.toolbar;
import android.support.annotation.LayoutRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
//自定义toolBar的Activity,那个Activity有ToolBar,就继承该类
public class ToolBarActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_bar_tool);
//把加载布局的方法进行重写
}
//进行布局加载方法的复写
@Override
public void setContentView(@LayoutRes int layoutResID) {
super.setContentView(layoutResID);
//创建ToolBarHelp对象,传递参数,1.上下文 2.布局资源(就由继承ToolBarActivity的Activity去写)
ToolBarHelp toolBarHelp = new ToolBarHelp(this, layoutResID);
//获取封装好的ToolBar对象
Toolbar toolBar = toolBarHelp.getToolBar();
//设置ToolBarhelp类中默认指定的根容器
setContentView(toolBarHelp.getContextView());
//设置支持ToolBar
setSupportActionBar(toolBar);
//自定义一些ToolBar的个性化设置
onCreateCustomToolbar(toolBar);
}
/**
* 自定义一些ToolBar的个性设置,继承的Activity记得要对它进行复写
* @param toolBar
*/
public void onCreateCustomToolbar(Toolbar toolBar) {
toolBar.inflateMenu(R.menu.toolbar_menu);
toolBar.setTitle("abc");
//设置支持ToolBar
setSupportActionBar(toolBar);
}
//当用户点击菜单栏中的某一个选项时,会调用该方法,重写此方法,当点击左上方图标时,关闭Activity
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home){
finish();
return true;
}
return super.onContextItemSelected(item);
}
}
Demo中用到的MenuXML文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--注意:xmlns:app=.../res-auto 是要修改的地方,下面要引用app-->
<!-- app:showAsAction= 对item是否隐藏折叠的设置,隐藏折叠显示文本,否则显示图片
always就是一直显示,never就是隐藏折叠-->
<item android:id="@+id/item0"
app:showAsAction="always"
android:icon="@drawable/miku"
android:title="item0"
/>
</menu>
效果图如下