ToolBar控件的使用<一> 通过菜单项设置ToolBar

  • Toolbar控件介绍

由于ActionBar存在不少问题,而且使用也不灵活。在更高的版本中,谷歌推出了新的控件Toolbar来替换ActionBar,并提供了低版本的兼容包,Toolbar更加自由灵活,子菜单和logo的设置和响应都比之前的更加方便,还可以随处放置。可以说,Toolbar是对ActionBar的进一步完善和强化,

  • 首先看下我们最终实现的效果图

效果图

网上看了一些文章,好些都是把ToolBar,AppBarLayout,CollapsingToolbarLayout,CoordinatorLayout等控件一块结合起来讲,但是我打算本文只单独讲讲ToolBar,后续文章再让Toolbar结合其他几个控件一块讲。

  • Toolbar控件的使用

<1> 隐藏ActionBar控件
为了使用ToolBar,首先我们需要隐藏之前的ActionBar,可以通过主题风格来隐藏ActionBar,也可以通过代码隐藏ActionBar,我一般是通过主题风格来实现的:


    <!--设置给ToolbarActivity的风格-->
    <style name="NoActionbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!--设置Toobar左侧空白消失-->
        <item name="toolbarStyle">@style/ClubToolbar</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

    <style name="ClubToolbar" parent="Widget.AppCompat.Toolbar">
        <item name="contentInsetStart">0dp</item><!-- 设置该属性解决Toolbar左侧空白部分-->
    </style>

    <!--设置给Toolbar的风格-->
    <style name="ToolBarTheme" parent="@style/ThemeOverlay.AppCompat.Light">
        <item name="android:textColorSecondary">#FFFFFFFF</item>
        <item name="android:colorBackground">#88FFFFFF</item>
        <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
        <item name="android:actionOverflowButtonStyle">@style/OverflowButtonStyle</item>
    </style>

    <!--设置toolbar弹出菜单的位置-->
    <style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
        <item name="overlapAnchor">false</item>  <!--设置为false即可使menu位置位于toolbar之下-->
    </style>
    <!--修改toolbar弹出剩余隐藏菜单条目按钮的样式-->
    <style name="OverflowButtonStyle" parent="@android:style/Widget.ActionButton.Overflow">
        <item name="android:src">@mipmap/ic_menu_setting</item>
    </style>

然后在AndroidManifest.xml中设置ToolBarActivity的主题

<activity android:name=".Toolbar.ToolBarActivity"  
          android:theme="@style/NoActionbarTheme"/>

<2> 把ToolBar控件放入到布局文件中
隐藏好ActionBar之后,我们直接把Toolbar放到布局文件中,可以通过代码和布局文件两种方式来设置Toolbar的logo,navigationIcon,title,subTitle等属性。这里我是通过布局文件来设置title的属性的。具体如下

<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".Toolbar.ToolBarActivity_01">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@mipmap/background02"/>

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:title="界面标题"
        app:subtitle="二级标题"
        app:navigationIcon="@mipmap/ic_menu_back"
        app:logo="@mipmap/logo"
        android:background="?attr/colorPrimary"
        android:theme="@style/ToolBarTheme"/>

</RelativeLayout>

<3>通过菜单项为ToolBar设置菜单条目以及响应事件

在Activity中,我们首先获取到toolbar,然后再把它设置给当前界面的工具栏。可以通过重写onCreateOptionsMenu方法来给当前Toolbar控件设置具体菜单条目。然后通过setOnMenuItemClickListener方法来监听具体哪个菜单字条被点击,通过setNavigationOnClickListener方法来监听navigationIcon是否被点击。

  • java代码
public class ToolBarActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tool_bar);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item)  {
                //在这里执行我们的逻辑代码
                switch (item.getItemId()){
                    case R.id.action_edit:
                        Toast.makeText(ToolBarActivity.this,"编辑被点击",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_share:
                        Toast.makeText(ToolBarActivity.this,"分享被点击",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_settings01:
                        Toast.makeText(ToolBarActivity.this,"设置01被点击",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_settings02:
                        Toast.makeText(ToolBarActivity.this,"设置02被点击",Toast.LENGTH_SHORT).show();
                        break;

                }
                return false;
            }
        });
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在这里执行我们的逻辑代码
                Toast.makeText(ToolBarActivity.this,"返回按钮被点击",Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // 为toolbar创建Menu
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

}
  • R.menu.menu_main对应的menu文件夹下面的menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context=".MainActivity">


  <item android:id="@+id/action_edit"
        android:title="@string/action_edit"
        android:orderInCategory="80"
        android:icon="@mipmap/ic_menu_edit"
        app:showAsAction="ifRoom" />

  <item android:id="@+id/action_share"
        android:title="@string/action_share"
        android:orderInCategory="90"
        android:icon="@mipmap/ic_menu_share"
        app:showAsAction="ifRoom" />

  <item android:id="@+id/action_settings01"
        android:title="@string/action_settings01"
        android:orderInCategory="100"
        android:icon="@mipmap/ic_menu_setting"
        app:showAsAction="ifRoom"/>

  <item android:id="@+id/action_settings02"
        android:title="@string/action_settings02"
        android:orderInCategory="100"
        android:icon="@mipmap/ic_menu_setting"
        app:showAsAction="ifRoom"/>

</menu>

你可以利用ActionBar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。
  这个属性可接受的值有:
  1、always:这个值会使菜单项一直显示在Action Bar上。
  2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
  3、never:这个值使菜单项永远都不出现在Action Bar上。
  4、withText:这个值使菜单项和它的图标,菜单文本一起显示。

<4>修改ToolBar隐藏菜单的弹出位置和颜色,弹出按钮的样式
ToolBar弹出隐藏菜单条目的默认位置和Menu处于同一水平高度,这样看起来很不美观,如果我们希望修改隐藏菜单的默认位置和颜色,以及修改弹出按钮的样式,就需要给ToolBar设置新的主题。
效果图:


修改之前
修改之后

具体代码如下:

    <style name="ToolBarTheme" parent="@style/ThemeOverlay.AppCompat.Light">
        <item name="android:textColorSecondary">#FFFFFFFF</item>
        <item name="android:colorBackground">#88FFFFFF</item>
        <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
        <item name="android:actionOverflowButtonStyle">@style/OverflowButtonStyle</item>
    </style>

    <!--设置toolbar弹出菜单的位置-->
    <style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
        <item name="overlapAnchor">false</item>  <!--设置为false即可使menu位置位于toolbar之下-->
    </style>
    <!--修改toolbar弹出剩余隐藏菜单条目按钮的样式-->
    <style name="OverflowButtonStyle" parent="@android:style/Widget.ActionButton.Overflow">
        <item name="android:src">@mipmap/ic_menu_setting</item>
    </style>

然后把这个ToolBarTheme风格设置给ToolBar,
android:theme="@style/ToolBarTheme"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容