ToolBar

本文参照Google官方的教程,进行了二次整理和实际使用中的经验总结。
Android develop之AppBar

前言

没什么前言了,能进来看ToolBar,相信你也知道为什么要使用ToolBar了。接下来请坐稳,让我们一起去Android developer上学习一下ToolBar。
先放一张Toolbar的示意图

Toolbar

一、ToolBar的基本入门使用

  1. 让你的工程依赖支持v7 appcompat。这个不废话。
  2. 让你要显示的Activity继承AppCompatActivity。
  3. 在清单Manifest中设置Application的主题为NoActionBar。
<application
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"
    />

如果你使用的是自定义主题,那么需要在你自定义的style里面加上下面的代码,让ActionBar隐藏。

  <item name="windowActionBar">false</item>
  <item name="android:windowNoTitle">true</item>
  1. 在activiy的xml布局文件中加上ToolBar。
<android.support.v7.widget.Toolbar
        android:id="@+id/my_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

需要注意下面几点

  • 一般Toolbar都是放到布局的最上面。
  • Material Design 规范)建议应用栏具有 4 dp 的仰角,所以要android:elevation="4dp"
  • android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    的作用是让ToolBar浮于其他Activity布局之上。
  1. 在Activity中初始化ToolBar。
@Override
protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_my);
          Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
          setSupportActionBar(myToolbar);
    }

这里其实是分为两步的:

  • 初始化ToolBar对象;
  • setSupportActionBar将ToolBar对象传递给Activity。该方法会将工具栏设置为 Activity 的应用栏。
  1. 至此,一个最基本的ToolBar就完成了,这个ToolBar会包含应用的名称和一个溢出菜单。

二、在ToolBar上添加menu

简单地说,就是把当前Activity上比较重要的功能放到ToolBar上,这样方便用户操作。比如我们在看到一篇很好的博客的时候,ToolBar上就可以放上一个分享和收藏的标签。
这里我们采用menu的方式来实现此功能。

  1. 在res/menu/下创建一个menu资源文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_favorite"
        android:icon="@drawable/ic_favorite_black_48dp"
        android:title="@string/action_favorite"
        app:showAsAction="ifRoom"/>

    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          app:showAsAction="never"/>
</menu>

每个menu的item设置icon、id、title。最重要的一个就是app:showAsAction,这个有下面个选项:

  • never:永远不显示的ToolBar上,只放在溢出菜单中(也就是三个竖点)。只有点击溢出菜单才会弹出。
  • always:无论是否溢出,总会显示。
  • ifRoom:如果还有地儿的话,那就显示上。没地儿的话就放到溢出菜单中。
  1. 将上一步的menu加载到ToolBar上。
    准确的说是将menu加载到Activity中,因为ToolBar取代了Activity的ActionBar,所以menu会被加载到ToolBar上。
    在Activity的onCreateOptionsMenu中加载menu
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_item, menu);
        return true;
    }
  1. 添加对Menu的响应。
    当我们点击了响应的menu,对应的处理方法依然和普通的menu一样是放在Activity的onOptionsItemSelected中。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chose the "Settings" item, show the app settings UI...
            return true;

        case R.id.action_favorite:
            // User chose the "Favorite" action, mark the current item
            // as a favorite...
            return true;

        default:
            // If we got here, the user's action was not recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}
  1. 修改menu的字体颜色
    一般默认主题的menu字体颜色是黑色,但是大多数我们希望的是白色。可以通过在style中加入一行设置来实现:
<item name="actionMenuTextColor">#ffffff</item>`

三、添加返回图标

添加返回图标有两种方式:

方法一:官方方法
  1. 在AndroidManifest中在ParentActivity和ChildActivity中加上配置:
<application ... >
    ...

    <!-- The main/home activity (it has no parent activity) -->

    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>

    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.MyChildActivity"
        android:label="@string/title_activity_child"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >

        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>
  1. 在Java代码中调用actionbar的setDisplayHomeAsUpEnabled()方法。这个方法是让返回按钮能显示出来
// my_child_toolbar is defined in the layout file
    Toolbar myChildToolbar = (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
    // Get a support ActionBar corresponding to this toolbar
    ActionBar ab = getSupportActionBar();
    // Enable the Up button
    ab.setDisplayHomeAsUpEnabled(true);

这是官方API上的教程。

方法二:使用menu

这个方法无需在AndroidManifest中进行配置

  1. 初始完成Toolbar之后,加上下面这两行:
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

这两行必须同时打开才可以。第一行是显示返回按钮,第二行是使action bar角落上的home button有效。

  1. 重写onOptionsItemSelected方法,监听android.R.id.home:
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            Toast.makeText(this, "哈哈哈", Toast.LENGTH_SHORT).show();
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
方法三:自己设置导航图标

ToolBar是可以自己设置导航icon的,我们完全可以把导航icon设置为返回按钮,然后开始监听返回按钮的点击事件。
看下面的代码。

       setSupportActionBar(toolbar);
       toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white);
       toolbar.setNavigationOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               finish();
           }
       });

四、Toolbar中加入自定义view

Toolbar为我们提供了title、subtitle、navigationIcon、还有各种menu等组件。但这些似乎并不能满足我们的设计师,似乎要在Toolbar中加入各种绚丽的功能,让我们的Toolbar变得功能更加丰富。这也难不倒我们。因为Toolbar继承了ViewGroup,所以只要你需要,你可以添加各种View到Toolbar中。使用方法也非常简单。只要在xml布局的Toolbar标签中直接添加View就可以,然后在Java代码中像普通组件一样直接使用就可以了。

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="hahaha"
            />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"
            />
    </android.support.v7.widget.Toolbar>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容