今天看啥  ›  专栏  ›  暗恋花香

Android Toolbar的使用详解

暗恋花香  · CSDN  ·  · 2020-01-01 00:00

修改主题

当我们新建一个工程时,我们发现默认是有导航栏的, 如图:
在这里插入图片描述
那是因为默认app主题自带了导航栏
在这里插入图片描述
在这里插入图片描述
我们发现,系统自带的是一个xxxActionBar,那么我们应该禁用掉 ActionBar

方法一

注意 要选择 xxxNoActionBar 也就是无导航栏的样式
在这里插入图片描述
以上主题任意选择一个即可。

方法二

你也可以在 res/style.xml 中配置 NoActionBar 主题样式 (全局可用)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryDark">@color/black</item>
        <item name="colorAccent">@color/teal_700</item>
    </style>
</resources>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

使用这种方式需要在 AndroidManifest.xml 中的对应的 activity 节点中设置 theme 属性
在这里插入图片描述
或者 在
在这里插入图片描述
现在开始添加一个ToolBar

布局中添加Toolbar

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

添加Toolbar具体内容

  // 设置Logo
  toolbar.setLogo(R.mipmap.ic_launcher);
  //  主标题
  toolbar.setTitle("主标题");
  //  副标题
  toolbar.setSubtitle("副标题");
  // 设置导航图标
  toolbar.setNavigationIcon(R.drawable.ab_android);
  ....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Toolbar常用属性

在这里插入图片描述

添加菜单

请先在项目的 res/menu/ 目录中创建新的 XML 文件。
接下来是菜单的初始化

方法一

通过inflateMenu可以添加toolbar的菜单

//设置菜单
toolbar.inflateMenu(R.menu.menu_main);
  • 1
  • 2
  • 1
  • 2

注意: 要想让Toolbar本身的inflateMenu生效,则必须删去这两句代码!!!

  setSupportActionBar(toolbar);
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  • 1
  • 2
  • 1
  • 2

方法二

调用Activity本身创建menu的接口

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.menu_main, menu);
     return super.onCreateOptionsMenu(menu);
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

监听菜单项

使用 inflateMenu 方法的

    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            String msg = "";
            switch (menuItem.getItemId()) {
                case R.id.action_edit:
                    msg += "点击标签";
                    break;
                case R.id.action_share:
                    msg += "点击分享";
                    break;
                case R.id.action_new:
                    msg += "点击新建";
                    break;
                case R.id.action_settings:
                    msg += "点击退出";
                    break;
            }
            if (!msg.equals("")) {
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
            return true;
        }
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

调用Activity本身创建menu的接口

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.menu_app:
                Toast.makeText(MainActivity.this, "单击了应用程序菜单", Toast.LENGTH_SHORT).show();
                break;
            case R.id.calendar:
                Toast.makeText(MainActivity.this, "单击了日历", Toast.LENGTH_SHORT).show();
                break;
            case R.id.paint:
                Toast.makeText(MainActivity.this, "单击了画图", Toast.LENGTH_SHORT).show();
                break;
            case R.id.pictures:
                Toast.makeText(MainActivity.this, "单击了图片", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

完整代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_edit"
        android:icon="@drawable/ab_edit"
        android:orderInCategory="80"
        android:title="@string/action_edit"
        app:showAsAction="ifRoom|withText" />
    <item
        android:id="@+id/action_share"
        android:icon="@drawable/regular_share"
        android:orderInCategory="80"
        android:title="@string/action_share"
        app:showAsAction="ifRoom|withText" />

    <item
        android:id="@+id/action_new"
        android:icon="@drawable/ab_new"
        android:orderInCategory="80"
        android:title="@string/action_new"
        app:showAsAction="ifRoom|withText" />
    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/setting"
        android:orderInCategory="80"
        android:title="@string/action_setting"
        app:showAsAction="ifRoom|withText" />
</menu>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

上面代码中组件的添加和Menu绘制的方法类似,唯一的区别就是app:showAsAction值的不同,而该属性正是 Toolbar关键所在。 app:showAsAction 属性共有 4个值,分别如下。
1)always:这个值会使菜单项一直显示在 ToolBar上。
2)ifRoom:如果有足够的空间,这个值会使菜单项显示在 Tool Bar上。
3)never:这个值会使菜单项永远都不出现在 ToolBar上。
4)withText:这个值会使菜单项和它的图标、菜单文本一起显示。一般和ifRoom一起通过“|”使用
app:showAsAction 属性值为 ifRoom|withText,表示如果有空间,那么就连同文字一起显示在标题栏中,否则就显示在菜单栏中。
而当app:showAsAction 属性值为 never时,该项作用为Menu不显示在菜单组件中。

MainActivity

package com.example.toolbar;

import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity {

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

        Toolbar toolbar = findViewById(R.id.toolbar);
        //设置Logo
        toolbar.setLogo(R.mipmap.ic_launcher);
        //主标题
        toolbar.setTitle("主标题");
        //副标题
        toolbar.setSubtitle("副标题");
        //设置导航图标
        toolbar.setNavigationIcon(R.drawable.ab_android);
        //添加菜单
        toolbar.inflateMenu(R.menu.menu_main);
        //监听菜单项
        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                String msg = "";
                switch (menuItem.getItemId()) {
                    case R.id.action_edit:
                        msg += "点击标签";
                        break;
                    case R.id.action_share:
                        msg += "点击分享";
                        break;
                    case R.id.action_new:
                        msg += "点击新建";
                        break;
                    case R.id.action_settings:
                        msg += "点击退出";
                        break;
                }
                if (!msg.equals("")) {
                    Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

在这里插入图片描述




原文地址:访问原文地址
快照地址: 访问文章快照