• android Toolbar的使用


    android Toolbar的使用

    参考文章

    ToolBar详解(手把手教程)
    stackoverflow-Android toolbar menu is not showing
    actionBar和Toolbar中如何动态隐藏和修改menu上的菜单

    效果图

    这里写图片描述

    配置material design

    请确保有依赖以下三项

        compile 'com.android.support:appcompat-v7:25.1.1'
        compile 'com.android.support:support-v4:25.1.1'
        compile 'com.android.support:design:25.1.1'

    去除原有的actionBar

        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <!--增加以下三行,为app去除原有actionBar-->
            <item name="windowActionBar">false</item>
            <item name="android:windowNoTitle">true</item>
            <item name="windowNoTitle">true</item>
        </style>

    toolbar代码

    reslayout oolbar.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!--colorPrimary是主题使用的颜色,可以value/color.xml中修改-->
    <!--actionBarSize是系统actionBar的高度-->
    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:menu="@menu/menu_toolbar"
        >
    
    </android.support.v7.widget.Toolbar>

    一般来说toolbar会应用多个activity,所以我单独作为一个xml来使用,
    在activity.xml中只需使用include标签,方便使用

        <include
            android:id="@+id/toolbar"
            layout="@layout/toolbar"
            />

    编写menu/menu_toolbar.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"
        >
        <!--showAsAction如果有足够的空间会显示出来,否则隐藏在工具栏里面-->
        <item
            android:id="@+id/search"
            android:icon="@mipmap/search"
            android:title="搜索"
            app:showAsAction="ifRoom"
            >
        </item>
        <item
            android:id="@+id/write"
            android:icon="@mipmap/write"
            android:title="书写"
            app:showAsAction="ifRoom"
            >
        </item>
        <item
            android:id="@+id/book"
            android:icon="@mipmap/book"
            android:title="书籍"
            app:showAsAction="ifRoom"
            >
        </item>
    </menu>

    java注意setSupportActionBar和onPrepareOptionsMenu

    srcMainActivity.java

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final TextView hello= (TextView) findViewById(R.id.hello);
            Toolbar toolbar= (Toolbar) findViewById(R.id.toolbar);
            //配置代替actionBar
            setSupportActionBar(toolbar);
            //设置图标
            toolbar.setLogo(getResources().getDrawable(R.mipmap.ic_launcher));
            toolbar.setNavigationIcon(R.mipmap.ic_launcher);
            toolbar.setTitle("setTitle主标题");
            toolbar.setSubtitle("setSubtitle副标题");
            toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()){
                        case R.id.search:
                            hello.setText("您点击了搜索");
                            break;
                        case R.id.write:
                            hello.setText("您点击了书写");
                            break;
                        case R.id.book:
                            hello.setText("您点击了书籍");
                            break;
                    }
                    return false;
                }
            });
        }
    
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_toolbar,menu);
            return super.onPrepareOptionsMenu(menu);
        }

    遇见的问题

    出现我第一时间考虑,没有使用menu属性配置。
    很显然我是有的

    <android.support.v7.widget.Toolbar
    ……
    app:menu="@menu/menu_toolbar"
    >
    </android.support.v7.widget.Toolbar>

    stackoverflow-Android toolbar menu is not showing
    我在参考了stackoverflow的问题,之后发现是我没有使用
    onPrepareOptionsMenu()

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_toolbar,menu);
            return super.onPrepareOptionsMenu(menu);
        }

    后来,我尝试保留onPrepareOptionsMenu(),把setSupportActionBar()去掉,发现menu同样也会消失不见。
    我由此估计,menu是actionbar才有的功能,toolbar只是调用了actionbar功能的部分方法。

    所以,才有先用setSupportActionBar()替换actionbar
    再onPrepareOptionsMenu();创建menu

    onPrepareOptionsMenu与onCreateOptionsMenu与onOptionsItemSelected的关系

    onCreateOptionsMenu():创建菜单,但是从初始开始就只运行一次,所以activity实例化后,无法修改菜单内容
    onOptionsItemSelected():对选中的菜单进行操作
    onPrepareOptionsMenu():创建菜单,activity初始化后仍会调用此方法,所以可在方法编写activity初始化后的功能

    关注我
  • 相关阅读:
    Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
    mysql 索引
    C++ 后台进程 daemon
    Linux进程状态
    实现一个简单的shared_ptr
    [LeetCode] Factorial Trailing Zeroes
    完美转发
    排序
    每天五个java相关面试题(7)--线程篇
    程序员为什么会淡忘?
  • 原文地址:https://www.cnblogs.com/zengmianhui/p/12634062.html
Copyright © 2020-2023  润新知