ToolBar封装

实现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>

效果图如下


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值