ToolBar 的再使用

1,779 阅读5分钟
原文链接: blog.csdn.net

上一篇介绍了ToolBar的最基本的用法,本篇我接着上一篇来说一下ToolBar的其他用法。如果不清楚基本用法的可以参照我的上一篇博文:
blog.csdn.net/james_shu/a…

注意上次的代码都是在Toolbar toolbar= (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);之间进行设定的。
其中setSupportActionBar(toolbar);指定了我们的ToolBar会继承使用ActionBar的一些属性。
其中,当我们未设定标题的时候,ToolBar默认会显示APP的lable,而且显示在屏幕的左上角,类似的效果还有其他的几个,下面我首先介绍当不使用setSupportActionBar(toolbar);时,为了满足我们的业务需求,我们所需要进行的定制操作。
1.标题的设定:

        toolbar.setTitle("Title");//设置主标题
        toolbar.setSubtitle("Subtitle");//设置子标题

同样的,我们也可以在布局文件中进行指定:

        app:subtitle="Title"
        app:title="Subtitle"

注意,通过上面的方式设置的标题默认是在ToolBar标题栏的左上角,我们如果要将标题居中显示, 可以在xml自定义标题,此时的setTitle可以设置为空。ToolBar在不继承ActionBar的属性的时候,Title默认是消失的

   <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorAccent"
            android:text="自定义标题"
            android:textSize="16sp"
            android:layout_gravity="center"
            />
    </android.support.v7.widget.Toolbar>

实现的效果:
这里写图片描述
2.菜单的设定:
当我们使用ActionBar时,经常在标题栏的右上角显示我们的菜单,而在我们的ToolBar中设定也很简单:

        toolbar.inflateMenu(R.menu.main);
        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()){
                    case R.id.item_tips:
                        Toast.makeText(getApplicationContext(),"提示",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.item_menu:
                        Toast.makeText(getApplicationContext(),"菜单",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.item_shop:
                        Toast.makeText(getApplicationContext(),"购物",Toast.LENGTH_SHORT).show();
                        break;
                }
                return true;
            }
        });

注意,当时用了setSupportActionBar(toolbar);时,上面的设定会失效,下文会有说明。
当然目前的设定可定制性仍然还没有完全体现出来。默认的Menu都会显示在右边,如果我们要将我们的菜单也能在左边显示呢?support-v7包为我们提供了ActionMenuView这个控件来完成定制功能。
首先在xml中定义:

  <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        >
        <android.support.v7.widget.ActionMenuView
            android:id="@+id/action_menu_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorAccent"
            android:text="自定义标题"
            android:textSize="16sp"
            android:layout_gravity="center"
            />
    </android.support.v7.widget.Toolbar>

将ActionMenuView放在ToolBar的第一个子View的位置,就能将菜单在左边显示。同时为了去掉左边默认带的边距我们需要指定两个属性:

        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"

然后我们可以在代码中设定:

        ActionMenuView actionMenuView= (ActionMenuView) findViewById(R.id.action_menu_view);
        getMenuInflater().inflate(R.menu.main,actionMenuView.getMenu());
        actionMenuView.setOnMenuItemClickListener(new ActionMenuView.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()){
                    case R.id.item_tips:
                        Toast.makeText(getApplicationContext(),"提示",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.item_menu:
                        Toast.makeText(getApplicationContext(),"菜单",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.item_shop:
                        Toast.makeText(getApplicationContext(),"购物",Toast.LENGTH_SHORT).show();
                        break;
                }
                return true;
            }
        });

目前实现的效果如下:
这里写图片描述
当然,ToolBar中的菜单选项可以设定加载布局文件:

    <item
        android:id="@+id/item_menu"
        android:title="菜单"
        app:actionLayout="@layout/action_menu"
        app:showAsAction="ifRoom" />

或者在代码中设定:

        MenuItem menuItem=actionMenuView.getMenu().findItem(R.id.item_menu);
        menuItem.setActionView(R.layout.action_menu);

监听事件的设定:

 menuItem.getActionView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

ToolBar是MD规范中的控件,当然Google官方也为我们指定了设置ToolBar上按钮属性的方式:

      <!--指定按钮文字的颜色-->
        <item name="android:actionMenuTextColor">#0000FF</item>
        <!--指定按钮文字的样式-->
        <item name="android:actionMenuTextAppearance">@style/ActionMenuTextAppearance</item>
        <!--指定按钮的风格-->
        <item name="android:actionButtonStyle">@style/ActionButtonStyle</item>
    <style name="ActionMenuTextAppearance" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Menu">
        <item name="android:textSize">18sp</item>
        <item name="android:textStyle">bold</item>
    </style>
    <style name="ActionButtonStyle" parent="Widget.AppCompat.Light.ActionButton">
        <item name="android:minWidth">44dp</item>
        <item name="android:paddingLeft">16dp</item>
        <item name="android:paddingRight">16dp</item>
        <item name="android:paddingBottom">16dp</item>
        <item name="android:paddingTop">16dp</item>
    </style>

3.导航图标的设定:

        toolbar.setNavigationIcon(R.drawable.ic_menu_slideshow);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(),"导航栏按钮",Toast.LENGTH_LONG).show();
            }
        });

下面介绍当使用setSupportActionBar(toolbar);时,由于我们会继承ActionBar自带的一些属性,所以此时我们的可定制性不是那么高,但是会更加方便快捷
1.标题的设定:
如果我们在代码中使用了ToolBar的setTitle的函数,那么新设定的值会覆盖原来的Label效果。当然在xml中的定制也是一样的。
2.菜单的设定:
如果我们使用setSupportActionBar(toolbar);,我们无法使用上面的方式设定菜单而应该使用传统的方式:

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.item_tips:                 
                Toast.makeText(getApplicationContext(),"提示",Toast.LENGTH_SHORT).show();
                break;
            case R.id.item_menu:
                Toast.makeText(getApplicationContext(),"菜单",Toast.LENGTH_SHORT).show();
                break;
            case R.id.item_shop:
                Toast.makeText(getApplicationContext(),"购物",Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

3.导航栏的设置:

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
        }

Ok,我能想到的ToolBar的使用方式就这些,如果你有更好的使用方式,请给我留言,谢谢。