Toolbar的封装及使用

一个app中如果多次的使用Toolbar,会写很多重复的代码,这也不符合我们的编程思想.所以要对Toolbar进行封装.

代码框架
Toolbar的封装及使用_第1张图片
程序效果(这里进行简单的设置)
Toolbar的封装及使用_第2张图片

布局文件
主窗体中没有进行编写
ToolbarActivity的xml文件代码
xml version= "1.0"  encoding= "utf-8" ?>
< RelativeLayout
    xmlns: android = "http://schemas.android.com/apk/res/android"
    xmlns: tools = "http://schemas.android.com/tools"
    android :layout_width= "match_parent"
    android :layout_height= "match_parent"
    tools :context= "com.dubuwucool.toolbardemo.ToolBarActivity">

    < android.support.v7.widget.Toolbar
        android :id= "@+id/toolBar"
        android :layout_width= "match_parent"
        android :layout_height= "wrap_content"
        android :background= "@android:color/holo_blue_dark">

        < LinearLayout
            android :layout_width= "match_parent"
            android :layout_height= "wrap_content"
            android :orientation= "horizontal"
            >

            < RelativeLayout
                android :layout_width= "match_parent"
                android :layout_height= "wrap_content"
                android :layout_weight= "1"
                >
                < EditText
                    android :id= "@+id/edt_text"
                    android :layout_width= "match_parent"
                    android :layout_height= "50dp"
                    android :background= "@drawable/round"
                    android :gravity= "center"
                    android :hint= " 输入商品、店铺、类型等 "
                    android :textSize= "25sp"
                    android :layout_toRightOf= "@+id/imgShow"
                    android :layout_alignParentLeft= "true"
                    android :layout_alignParentStart= "true"/>

                < ImageView
                    android :id= "@+id/imgShow"
                    android :layout_width= "40dp"
                    android :layout_height= "30dp"
                    android :src= "@drawable/serach"
                    android :layout_marginLeft= "15dp"
                    android :layout_marginStart= "15dp"
                    android :layout_centerVertical= "true"
                    android :layout_alignParentLeft= "true"
                    android :layout_alignParentStart= "true"/>
            RelativeLayout
>

            < ImageButton
                android :layout_width= "160dp"
                android :layout_height= "40dp"
                android :layout_weight= "3"
                android :background= "@drawable/sound"
                android :layout_gravity= " center_vertical "/>
        LinearLayout>

    android.support.v7.widget.Toolbar>

RelativeLayout>

round.xml代码

xml version= "1.0"  encoding= "utf-8" ?>
< shape  xmlns: android = "http://schemas.android.com/apk/res/android"
    android :shape= "rectangle">
    < solid  android :color= "#FFFFFF" />
    < corners  android :bottomRightRadius= "15dp"
              android :bottomLeftRadius= "15dp"  android :topLeftRadius= "15dp"
              android :topRightRadius= "15dp" />
shape
>

步骤(具体功能看解析)

1.要使用Toolbar就必须先隐藏ActionBar
①可以改变某个activity的主题
Toolbar的封装及使用_第3张图片 
②也可以改变某个app的主题
选中该行进入style文件中进行修改
Toolbar的封装及使用_第4张图片
修改为这样即可


2.创建一个ToolbarActivity

ToolBarActivity是继承AppCompatActivity 并重写setContentView方法
public class ToolBarActivity extends AppCompatActivity {

    private ToolbarHelper mToolbarHelper;

    //自定义ToolBarActivity,哪个activityToolbar,就继承该类
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //   setContentView(R.layout.activity_tool_bar);
    }

    //把记住布局的方法进行重写
    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        super.setContentView(layoutResID);
        //创建ToolbarHelper对象传递参数 1.上下文 2.布局资源
        mToolbarHelper new ToolbarHelper(this, layoutResID);
        //获取封装好的Toolbar对象
        Toolbar toolBar = mToolbarHelper.getToolBar();
        //设置ToolbarHelper类中默认指定的根容器
        setContentView(mToolbarHelper.getContentView());
        //自定义一些Toolbar的个性化设置     切记:该方法一定要在setSupportActionBar()之前,否则主标题的设置会无效
        onCreateCustomToolbar(toolBar);
        //设置支持Toolbar
        setSupportActionBar(toolBar);
    }

    //自定义一些Toolbar的个性化设置,继承activity记得要对他进行覆写
    public void onCreateCustomToolbar(Toolbar toolBar) {

    }

    //当用户点击菜单栏中的某个选项时,会调用此方法,重写此方法每当点击坐上发图标时,关闭Activity
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

3.创建ToolbarHelper类
这个类的功能是:先创建一个 ViewGroup 来作为视图的父 View,把用户定义的 View,和 toolBar 依次 Add 到 ViewGroup 中;

public class ToolbarHelper {
    //声明一个上下文  当把xml布局资源转换为view的时候用到
    private Context context;
    //跟布局
    private FrameLayout contentView;
    //用户传入的xml布局资源对象
    private View userView;
    private LayoutInflater inflater;
    //toolbar的对象,通过getToolbar获取
    private Toolbar toolBar;

    /**
     * Toolbar帮助类的构造方法,方便用户自定义Toolbar,进行对象的初始化
     *
     * @param context  上下文
     @param layoutID 布局xml资源
     */
    public ToolbarHelper(Context context, int layoutID) {
        //传递的上下文
        this.context = context;
        //因为普通类,没有getLayoutInflater()方法可以调用,
        // 所以传递一个上下文,通过LayoutInflater.from静态方法得到LayoutInflater对象
        inflater = LayoutInflater.from(context);
        //初始化整个内容
        initContentView();
        //初始化用户自定义的布局
        initUserView(layoutID);         
        //初始化ToolBar控件
        initToolBar();
    }

    //初始化整个布局内容
    private void initContentView() {
        //创建一个布局,作为视图容器的父容器
        contentView new FrameLayout(context);
        //设置参数对象,定义父窗体的宽高
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //把参数对象传递给视图容器
        contentView.setLayoutParams(layoutParams);
    }

    private void initUserView(int layoutID) {
        //把用户传递过来的布局xml资源转换为一个view对象
        userView inflater.inflate(layoutID, null);
        //设置参数对象,定义父窗体的宽高
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //   //把参数对象传递给视图容器
        userView.setLayoutParams(layoutParams);
    }

    private void initToolBar() {
        //把一个装有Toolbar的布局资源转换为一个View对象
        View inflate = inflater.inflate(R.layout.activity_tool_barcontentView);
        //找到布局xml文件资源列队Toolbar,设置为全局变量
        toolBar = (Toolbar) inflate.findViewById(R.id.toolBar);
    }

    //返回Toolbar的对象,方便用户对Toolbar的自定义
    public Toolbar getToolBar() {
        return toolBar;
    }

    //获取默认的跟布局对象,FrameLayout
    public FrameLayout getContentView() {
        return contentView;
    }
}


4.最后就是主窗体的代码

//MainActivity就是使用我们的Toolbar封装
public class MainActivity extends ToolBarActivity {
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       

    }
    //自定义控件属性,ToolBar的设置都在这里写
    @Override
    public void onCreateCustomToolbar(Toolbar toolBar) {
        super.onCreateCustomToolbar(toolBar);
        //设置Toolbar的菜单按钮
        toolBar.showOverflowMenu();
    }

    //初始化菜单的按钮
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        return true;
    }
   
    //设置菜单按钮的点击事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }
}










你可能感兴趣的:(Toolbar的封装及使用)