精华内容
下载资源
问答
  • toolbar

    2017-08-24 19:36:00
    1、创建一个toolbar资源 2、构建一个toolbar对象toolbar 3、调用toolbar.Create或者toolbar.CreateEx创建toolbar,并将toolbar对象附加在我们的框架窗口上。 4、将toolbar资源,加载toolbar对象(toolbar....

    1、创建一个toolbar资源

    2、构建一个toolbar对象toolbar

    3、调用toolbar.Create或者toolbar.CreateEx创建toolbar,并将toolbar对象附加在我们的框架窗口上。

    4、将toolbar资源,加载toolbar对象(toolbar.LoadToolBar(IDR_TOOLBAR1);)

    5、使用toolbar.EnableDocking(CBRS_ALIGN_ANY),说明toolbar可以停靠在哪里。该函数参数可选

    6、使用toolbar所停靠的父窗口类的EnableDocking函数,来说明,toolbar可以停靠在父窗口的什么位置

    7、使用父窗口类的DockControlBar(&toolbar, AFX_IDW_DOCKBAR_TOP); 来将toolbar停靠指定位置

    8、toolbar.SetWindowText(TEXT("tool"));//设置toolbar窗口标题

    9、

        toolbar.Create(this);
        toolbar.LoadToolBar(IDR_TOOLBAR1);
        toolbar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&toolbar, AFX_IDW_DOCKBAR_TOP);
        toolbar.SetWindowText(TEXT("tool"));        

     

    转载于:https://www.cnblogs.com/xiaohaige/p/7424918.html

    展开全文
  • ToolBar

    2016-09-28 11:29:15
    过年前发了一篇介绍 ...今天开始写第二篇,全面的介绍一下 Toolbar 的使用。说起 Toolbar ,可能有很多开发的童鞋还比较陌生,没关系,请接着往下看。 初识 Toolbar Toolbar是在 Android 5.0 开始推出的一个 Ma

    过年前发了一篇介绍 Translucent System Bar 特性的文章 Translucent System Bar 的最佳实践 ,收到很多开发者的关注和反馈。今天开始写第二篇,全面的介绍一下 Toolbar 的使用。说起 Toolbar ,可能有很多开发的童鞋还比较陌生,没关系,请接着往下看。

    初识 Toolbar

    Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android客户端的导航栏,以此来取代之前的 Actionbar 。与 Actionbar 相比, Toolbar 明显要灵活的多。它不像 Actionbar 一样,一定要固定在Activity的顶部,而是可以放到界面的任意位置。除此之外,在设计 Toolbar 的时候,Google也留给了开发者很多可定制修改的余地,这些可定制修改的属性在API文档中都有详细介绍,如:

    • 设置导航栏图标;
    • 设置App的logo;
    • 支持设置标题和子标题;
    • 支持添加一个或多个的自定义控件;
    • 支持Action Menu;

    Android开发:最详细的 Toolbar 开发实践总结

    Toolbar支持的特性

    总之,与 Actionbar 相比, Toolbar 让我感受到Google满满的诚意。怎样?是否已经对 Toolbar 有大概的了解,跃跃欲试的感觉出来了有木有?接下来,我们就一步一步的来看如何使用 Toolbar (其实是我使用 Toolbar 踩坑填坑的血泪史,你们接下去看,我先擦个眼泪…. )。

    开始使用 Toolbar

    前面提到 Toolbar 是在 Android 5.0 才开始加上的,Google 为了将这一设计向下兼容,自然也少不了要推出兼容版的 Toolbar 。为此,我们需要在工程中引入 appcompat-v7 的兼容包,使用 android.support.v7.widget.Toolbar 进行开发。下面看一下代码结构,同样把重点部分已经红圈圈出:

    Android开发:最详细的 Toolbar 开发实践总结
    关键部分代码

    • ToolbarActivity 包含了 Toolbar 的一些基本使用, ZhiHuActivity 是在熟悉了 Toolbar 后对知乎主页面的一个高仿实现。
    • layout和menu文件夹分别是上面提到的两个Activity的布局文件 和 actionmenu 菜单文件。
    • values、values-v19、values-v21 中包含了一些自定义的 theme,后面用到的时候会顺带讲解。

    我们先来看一下 ToolbarActivity 的运行效果

    Android开发:最详细的 Toolbar 开发实践总结

    ToolbarActivity效果图

    按照效果图,从左到右分别是我们前面提及到的 导航栏图标App的logo 标题和子标题自定义控件 、以及 ActionMenu 。接着,我们来看下布局文件和代码实现。

    首先,在布局文件 activity_tool_bar.xml 中添加进我们需要的 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"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/color_0176da">
    
            <!--自定义控件-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Clock" />
        </android.support.v7.widget.Toolbar>
    </LinearLayout>

    接着在 base_toolbar_menu.xml 中添加 action menu 菜单项

    <?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_search"
            android:icon="@mipmap/ic_search"
            android:title="@string/menu_search"
            app:showAsAction="ifRoom" />
    
        <item
            android:id="@id/action_notification"
            android:icon="@mipmap/ic_notifications"
            android:title="@string/menu_notifications"
            app:showAsAction="ifRoom" />
    
        <item
            android:id="@+id/action_item1"
            android:title="@string/item_01"
            app:showAsAction="never" />
    
        <item
            android:id="@+id/action_item2"
            android:title="@string/item_02"
            app:showAsAction="never" />
    </menu>

    最后到 ToolbarActivity 中调用代码拿到这 Toolbar 控件,并在代码中做各种setXXX操作。

    /**
     * Toolbar的基本使用
     */
    public class ToolBarActivity extends BaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_tool_bar);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    
            toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);//设置导航栏图标
            toolbar.setLogo(R.mipmap.ic_launcher);//设置app logo
            toolbar.setTitle("Title");//设置主标题
            toolbar.setSubtitle("Subtitle");//设置子标题
    
            toolbar.inflateMenu(R.menu.base_toolbar_menu);//设置右上角的填充菜单
            toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    int menuItemId = item.getItemId();
                    if (menuItemId == R.id.action_search) {
                        Toast.makeText(ToolBarActivity.this , R.string.menu_search , Toast.LENGTH_SHORT).show();
    
                    } else if (menuItemId == R.id.action_notification) {
                        Toast.makeText(ToolBarActivity.this , R.string.menu_notifications , Toast.LENGTH_SHORT).show();
    
                    } else if (menuItemId == R.id.action_item1) {
                        Toast.makeText(ToolBarActivity.this , R.string.item_01 , Toast.LENGTH_SHORT).show();
    
                    } else if (menuItemId == R.id.action_item2) {
                        Toast.makeText(ToolBarActivity.this , R.string.item_02 , Toast.LENGTH_SHORT).show();
    
                    }
                    return true;
                }
            });
    
        }
    
    }

    代码到此已经完成了 Toolbar 的基本使用,注意,是基本使用而已!!!!!下面有几个代码里面需要注意的地方:

    1. 我们在使用 Toolbar 时候需要先隐藏掉系统原先的导航栏,网上很多人都说给Activity设置一个NoActionBar的Theme。但个人觉得有点小题大做了,所以这里我直接在BaseActivity中调用 supportRequestWindowFeature(Window.FEATURE_NO_TITLE) 去掉了默认的导航栏(注意,我的BaseActivity是继承了AppCompatActivity的,如果是继承Activity就应该调用 requestWindowFeature(Window.FEATURE_NO_TITLE) );
    2. 如果你想修改标题和子标题的字体大小、颜色等,可以调用 setTitleTextColorsetTitleTextAppearancesetSubtitleTextColorsetSubtitleTextAppearance 这些API;
    3. 自定义的View位于 titlesubtitleactionmenu 之间,这意味着,如果 titlesubtitle 都在,且 actionmenu选项 太多的时候,留给自定义View的空间就越小;
    4. 导航图标和 app logo 的区别在哪?如果你只设置 导航图标 ( or app logo ) 和 titlesubtitle ,会发现 app logotitlesubtitle 的间距比较小,看起来不如 导航图标 与 它们两搭配美观;
    5. Toolbar和其他控件一样,很多属性设置方法既支持代码设置,也支持在xml中设置(这里也是最最最最最坑爹的地方,如何坑爹法,请接着往下看);

    Toolbar 踩坑填坑

    坑一:xml布局文件中,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"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/color_0176da"
            android:logo="@mipmap/ic_launcher"
            android:navigationIcon="@mipmap/ic_drawer_home"
            android:subtitle="456"
            android:title="123">
    
            <!--自定义控件-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Clock" />
        </android.support.v7.widget.Toolbar>
    </LinearLayout>

    在真机跑起来之后,看到的结果是下面这样的。

    Android开发:最详细的 Toolbar 开发实践总结

    Toolbar 属性设置无效

    此时心中真是万千匹草泥马在奔腾,除了设置背景色和TextView有效外,说好的 logonavigationIconsubtitletitle 都跑哪去了?在编译器没报错又不见效果的情况下,参考了其他开发者的用法后找到了以下的解决方案,就是在根布局中加入自定义属性的命名空间

    xmlns:toolbar="http://schemas.android.com/apk/res-auto"(这里的toolbar可以换成你想要其他命名,做过自定义控件的童鞋相比很熟悉此用法了)

    然后把所有用 android:xxx 设置无效的,都用 toolbar:xxx 设置即可生效。最终的布局代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:toolbar="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/color_0176da"
            toolbar:navigationIcon="@mipmap/ic_drawer_home"
            toolbar:logo="@mipmap/ic_launcher"
            toolbar:subtitle="456"
            toolbar:title="123">
    
            <!--自定义控件-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Clock" />
        </android.support.v7.widget.Toolbar>
    </LinearLayout>

    到此即可解决 xml 中属性设置失效的问题,为什么会出现这种问题呢?我猜测是因为这个控件是兼容版的控件,用 android:xxx 设置无效是的这些属性是在兼容包中,不在默认的Android SDK中,所以我们需要额外的引入。至于为什么IDE不报错,估计就是bug了吧!

    坑二:Action Menu Item 的文字颜色设置无效

    系统默设置了ActionMenu每个Item的文字颜色和大小,像ToolbarActivity在Google原生5.1系统下默认效果就是下面这样的

    Android开发:最详细的 Toolbar 开发实践总结

    Android 5.1 默认的ActionMenu Item的风格

    此时,如果我有需求要改变一下item文字颜色,应该怎么破?我按照网上比较普遍的解决方案,做了如下两步的修改操作:

    在styles.xml中自定义一个Theme,并设置 actionMenuTextColor 属性(注意:不是 android:actionMenuTextColor )

    <style name="Theme.ToolBar.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="actionMenuTextColor">@color/color_red</item>
    </style>

    在布局文件的Toolbar中设置popupTheme(注意:是toolbar:xxx,不是android:xxx)

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/color_0176da"
            toolbar:popupTheme="@style/Theme.ToolBar.Base">
    
            <!--自定义控件-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Clock" />
        </android.support.v7.widget.Toolbar>

    运行之后,文字的颜色的并没有发生任何改变。说好的改变颜色呢…..找来找去,最后再 StackOverflow 找到一个还不错的解决方案,就是把上面的的 actionMenuTextColor 属性换成 android:textColorPrimary 即可解决,最终得到下面的运行效果。

    Android开发:最详细的 Toolbar 开发实践总结

    成功修改 actionmenu item 文字的颜色

    这种方法也有一个小缺点,如果我把自定义控件换成Button,你会发现Button默认的文字颜色也变成了红色。所以,此处如果有朋友有更好的解决方案,请留言赐教。

    如果你想要修改 ActionMenu Item 的文字大小,也可以在theme中设置加上如下设置

    <item name="android:textSize">20sp</item>

    以上就是目前使用 Toolbar 一些比较折腾的坑,感觉 Google 对 Toolbar 这些坑,还可以进一步优化优化,不然就坑苦了开发者们了。

    仿知乎主页面

    为了加深一下 Toolbar 的开发体验,我们使用 Toolbar 来实现知乎主页的效果!先来看下知乎主页的效果

    Android开发:最详细的 Toolbar 开发实践总结

    Android 5.1上知乎主页效果图

    如果前面的内容你看明白,想撸出这个界面无非是几分钟的事情,下面就直接上代码,不做赘述了。

    ZhiHuActivity界面代码

    public class ZhiHuActivity extends BaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_zhi_hu);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            toolbar.inflateMenu(R.menu.zhihu_toolbar_menu);
    
            toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);
    
            toolbar.setTitle(R.string.home_page);
            toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));
        }
    }

    zhihu_toolbar_menu.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_search"
            android:icon="@mipmap/ic_search"
            android:title="@string/menu_search"
            app:showAsAction="ifRoom" />
    
        <item
            android:id="@id/action_notification"
            android:icon="@mipmap/ic_notifications"
            android:title="@string/menu_notifications"
            app:showAsAction="ifRoom" />
    
        <item
            android:id="@id/action_settings"
            android:orderInCategory="100"
            android:title="@string/menu_settings"
            app:showAsAction="never" />
    
        <item
            android:id="@id/action_about"
            android:orderInCategory="101"
            android:title="@string/menu_about_us"
            app:showAsAction="never" />
    </menu>

    activity_zhi_hu.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"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/color_0176da"
            android:theme="@style/Theme.ToolBar.ZhiHu">
    
        </android.support.v7.widget.Toolbar>
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">
    
            <ImageView
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_centerInParent="true"
                android:background="@mipmap/ic_zhihu_logo" />
        </RelativeLayout>
    
    </LinearLayout>

    styles.xml 中的 Theme.ToolBar.ZhiHu,给 Toolbar 设置android:theme用的

    <resources>
    
        ...
        ...
    
        <style name="Theme.ToolBar.ZhiHu" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="actionOverflowButtonStyle">@style/ActionButton.Overflow.ZhiHu</item>
        </style>
    
        <style name="ActionButton.Overflow.ZhiHu" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
            <item name="android:src">@mipmap/ic_menu_more_overflow</item>
        </style>
    
    </resources>

    最终得到下面这样的效果

    Android开发:最详细的 Toolbar 开发实践总结

    Android5.1上仿知乎主页面效果

    这里在 Toolbar 设置 android:theme=”@style/Theme.ToolBar.ZhiHu” 主要是为了替换系统右上角三个点的图标,如果不设置,则会成系统默认主题的样子。

    Android开发:最详细的 Toolbar 开发实践总结

    不设置Theme的效果

    最后,再给知乎的主页面做个小小的优化,它在 Android 4.4 上运行还是能够看到一条黑乎乎的通知栏,为此我把 ToolbarTranslucent System Bar 的特性结合起来,最终改进成下面的效果(附上 Android4.4 和 5.1 上的运行效果)。

    Android开发:最详细的 Toolbar 开发实践总结

    Android4.4上改进版的知乎主页

    Android开发:最详细的 Toolbar 开发实践总结

    Android5.1上改进版的知乎主页

    如果你还不知道 Translucent System Bar 的特性怎么使用,请查看我的上一篇文章: Translucent System Bar 的最佳实践

    总结

    关于 Toolbar 的使用就介绍到此,本来是怀着很简单就可以上手的心态来使用,结果发现还是有很多坑需要填。果然还是验证了一句老话

    纸上得来终觉浅,绝知此事要躬行

    对于想要更深的了解 Toolbar 设计的童鞋,也可以看看这篇 官网文档 (自备梯子)。

    同样,分享即美德,需要源代码的童鞋,请戳: https://github.com/D-clock/AndroidSystemUiTraining

    展开全文
  • Toolbar的详细介绍和自定义Toolbar

    万次阅读 多人点赞 2018-03-14 17:26:12
    在此总结一下,Android Toolbar 控件的使用方法,争取总结的系统全面些。之前也只是停留在一些基本简单的用法,而且也不系统。希望爱学习的你能通过这篇文章,有所收获! Toolbar 的基本用法 常用的方法 xml...

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

    在此总结一下,Android Toolbar 控件的使用方法,争取总结的系统全面些。之前也只是停留在一些基本简单的用法,而且也不系统。希望爱学习的你能通过这篇文章,有所收获!

    Toolbar 的基本用法

    常用的方法

    xml中的设置:

    <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorAccent"
            app:navigationIcon="@drawable/ic_back_white_24dp"
            app:title="标题"
            app:titleTextColor="@color/white">
     </android.support.v7.widget.Toolbar>

    如果你不在xml中设置参数的话,代码中的设置:

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            toolbar.setTitle("标题");
            toolbar.setTitleTextColor(Color.WHITE);
            toolbar.setNavigationIcon(R.drawable.ic_back_white_24dp);
    
            //点击左边返回按钮监听事件
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
    

    由于比较简单,效果图这里也不在贴出啦。

    全面但包括不太常用的用法

    xml中的配置:

    <!--   navigationIcon  左边返回箭头图标
           navigationContentDescription 目前还不知道其作用
           titleMarginStart  标题距离(开始)左边的距离
           -->
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorAccent"
            app:logo="@mipmap/ic_launcher"
            app:navigationContentDescription=""
            app:navigationIcon="@drawable/ic_back_white_24dp"
            app:subtitle="子标题"
            app:subtitleTextColor="@color/white"
            app:title="标题"
            app:titleMarginStart="90dp"
            app:titleTextColor="@color/white">
    

    同样如果不在xml中设置参数的话,代码中的设置:
    这里就不在贴出代码啦,设置的时候,先敲打出xml配置中的关键单词或首字母,就会自动提示的。大部分在xml有的属性,代码中都可以设置

    效果图:
    这里写图片描述

    注意事项:
    1:如果你添加了这行代码 setSupportActionBar(toolbar); 那么 toolbar.setNavigationOnClickListener监听方法,要放到其后面,否则点击事件,监听不到的。如果你用不到ActionBar的一些特性的话,建议setSupportActionBar(toolbar); 这行代码不用添加了。

    如果你想修改主标题和子标题的文字大小,你可通过如下方式:
    首先定义一个style:

     <!--主标题-->
    <style name="ToolbarTitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
           <item name="android:textColor">#f0f0</item>
            <item name="android:textSize">15sp</item>
        </style>
    
     <!--子标题-->
    <style name="ToolbarSubtitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
            <item name="android:textColor">#f0f0</item>
            <item name="android:textSize">10sp</item>
        </style>

    然后:

     <!-- app:titleTextAppearance="@style/ToolbarTitle"-->
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorAccent"
            app:logo="@mipmap/ic_launcher"
            app:navigationContentDescription=""
            app:navigationIcon="@drawable/ic_back_white_24dp"
            app:subtitle="子标题"
            app:subtitleTextColor="@color/white"
            app:title="标题"
            app:titleMarginStart="90dp"
            app:titleTextAppearance="@style/ToolbarTitle"
            app:titleTextColor="@color/white">

    效果图这里不在贴出了,通过app:titleTextAppearance=”@style/ToolbarTitle”方法的设置,就能修改标题字体的大小,当然文字颜色也可以修改。

    到这里,你可能要问了,如果,我想要标题居中,怎么办呢?查看api,toolbar没有使其居中的方法,也就提供了使其距左右,上下边距大小的方法。不过不用担心,这里还是有办法的。看如下代码:

     <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorAccent">
    
            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="标题"
                android:textColor="@color/white"
                android:textSize="22sp" />
    
        </android.support.v7.widget.Toolbar>

    效果图:
    这里写图片描述

    注意: 此时 TextView 控件的宽和高都是自适应大小,java 代码中此行代码setSupportActionBar(toolbar);就不要添加了,否则就会显示不正常。如果你非要添加setSupportActionBar(toolbar);这行代码的话,TextView 控件的宽要用match_parent属性。这里再次建议setSupportActionBar(toolbar);这行代码就不要点添加了。
    至于它的作用,在此做一下简单的说明吧:
    1)在Toolbar这个控件出现之前,其实我们也可以通过 ActionBar actionBar = getSupportActionBar(); 方法获取到acitonbar,(前提你的activity主题theme,是采用的带actionbar的主题,如果你采用这样的主题android:theme="@style/Theme.AppCompat.Light.NoActionBar">拿到的actionBar也是 null,显然是不行的)之后你就可以采用诸如下面的方面来操作actionbar啦。

     ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setDisplayShowTitleEnabled(true);
                actionBar.setTitle("主标题");
                   ......
            } else {
                Log.i(TAG, "onCreate: actionBar is null");
            }

    但是,原生自带的ActionBar设置的灵活性,还是有限,因此Toolbar 这个控件,也就应运而生啦!此时,有的小伙伴说了,我虽然使用了Toolbar来代替ActionBar,但是我还想使用ActionBar的一些特性怎么办呢?这个时候 setSupportActionBar(toolbar);就发挥其作用啦。添加这行代码,你的toolbar可以说也就具有了ActionBar的相关属性了。好啦,到此setSupportActionBar(toolbar) 的作用也讲完了。如果你还不太明白的话,可以参考一下篇文章:
    ActionBar和Toolbar的基础使用

    结合menu配置文件的用法。

    这里先看一下效果图:
    这里写图片描述

    首先在menu文件夹中,创建名为 menu.xml 文件(文件名随意的):

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/action_search"
            android:icon="@drawable/ic_search"
            android:title="Search"
            app:showAsAction="ifRoom" />
        <item
            android:id="@+id/action_notifications"
            android:icon="@drawable/ic_delete_white_24dp"
            android:title="notifications"
            app:showAsAction="ifRoom" />
        <item
            android:id="@+id/action_settings"
            android:icon="@mipmap/ic_launcher"
            android:orderInCategory="100"
            android:title="@string/action_settings"
            app:showAsAction="never" />
    </menu>
    
    

    然后在代码中这样加载该menu文件即可:

     toolbar.inflateMenu(R.menu.menu);

    最后运行代码,就是上图的效果。

    在这里,app:showAsAction 属性还是很有必要介绍一下滴。
    app:showAsAction 有以下三个属性:

    1. ifRoom 表示在屏幕空间足够的情况下显示在Toolbar中,不够的话就显示在菜单中
    2. never 表示永远不显示在Toolbar中,而是一直显示在菜单中
    3. always 表示永远显示在Toolbar中,如果屏幕空间不够则不显示

    注意:Toolbar中的action按钮只会显示图标,菜单中的action按钮只会显示文字。

    那如果设置了ifRoom 属性之后,既然只显示图标不显示文字,那还设置 android:title=”Search” 文字干嘛呢?如果你设置了之后,虽然不显示,但是你长按相应按钮后,就会吐司相应文字内容的。

    细心的你可能发现还有些不足的地方,就是上图的点击菜单选项时,弹出的菜单位置有点太靠上啦,能不能设置呢,还有菜单的背景和文字颜色能不能设置呢?答案当然是可以的!

    首先设置好样式:

     <style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark">
             <!--<item name="android:colorBackground">#000000</item>--> <!--这里可以改变菜单的背景色-->
            <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item> <!--新增一个item,用于控制menu-->
        </style>
    
        <style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
            <item name="overlapAnchor">false</item>  <!--把该属性改为false即可使menu位置位于toolbar之下-->
        </style>

    然后直接在这里引用就可以了: app:popupTheme=”@style/ToolbarPopupTheme”

     <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorAccent"
            app:popupTheme="@style/ToolbarPopupTheme">
    
            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="标题"
                android:textColor="@color/white"
                android:textSize="22sp" />
    
        </android.support.v7.widget.Toolbar>

    效果图:
    这里写图片描述

    与AppBarLayout结合的使用

    (1): app:layout_scrollFlags=”scroll”

    xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 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="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?android:attr/actionBarSize"
                android:background="@color/colorAccent"
                app:layout_scrollFlags="scroll"
                app:popupTheme="@style/ToolbarPopupTheme">
    
            </android.support.v7.widget.Toolbar>
    
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v4.widget.NestedScrollView
            android:id="@+id/nestedScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="16dp"
                    android:text="@string/large_text" />
    
            </LinearLayout>
    
    
        </android.support.v4.widget.NestedScrollView>
    
    
    </android.support.design.widget.CoordinatorLayout>
    

    首先注意最外层:包裹了一层 android.support.design.widget.CoordinatorLayout 布局,那CoordinatorLayout 布局是什么的,我们可以理解为它是加强版的FramLayout。然后注意:Toolbar 的新添加的这条属性 app:layout_scrollFlags=”scroll” 。最后看一看效果图:
    这里写图片描述

    PS:对于 scroll 属性,网上也有说的比较专业的,不过我认为从产生的效果角度去分析的话,那就是:往上滑动就不说了,往下滑动就是当下面的滚动布局滑动到顶端时,标题栏toolbar才会滑出来。该属性实用性一般吧。

    (2):app:layout_scrollFlags=”scroll|enterAlways”

    scroll 与 enterAlways 结合产生的效果图如下:

    这里写图片描述

    PS:我们还是从产生的效果角度去分析的:往下滑动时,,标题栏 toolbar 会优先滑出来,然后滚动布局才开始滑动。就像该单词的意思一样:总是在。也就是只要添加了该属性值,下滑时 toolbar 总是优先滑出来。该属性比较实用。

    (3): app:layout_scrollFlags=”scroll|enterAlways|snap”

    在以上基础上,在与 snap 结合所产生的效果图如下:
    这里写图片描述

    PS:还是从产生的效果角度去分析的:不管是往下或者往上滑动时,,标题栏 toolbar 首先还是和(2)中一样的,不过有个细微的不同,toolbar会根据当前的滚动距离,自动选择是隐藏还是显示。该属性实用性也一般。

    (4): app:layout_scrollFlags=”scroll|enterAlways|exitUntilCollapsed”

    scroll 与 enterAlways 与 exitUntilCollapsed 结合所产的效果图如下:
    这里写图片描述

    注意此时Toolbar的布局有些许改变(改变后的):

     <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:background="@color/colorAccent"
                android:minHeight="40dp"
                app:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed"
                app:popupTheme="@style/ToolbarPopupTheme">
    
            </android.support.v7.widget.Toolbar>

    我们给Toolbar 设置了一个最小高度 android:minHeight=”40dp”,然后又把正常高度改变了,并随意改成了100dp。

    PS:还是从产生的效果角度去分析的:默认toolbar 显示的正常高度值我们设置成的100dp,当我们上滑的时候,高度达到最小高度40dp时,toolbar不在滑动了。该属性感觉实用性不强。

    (5): app:layout_scrollFlags=”scroll|enterAlways|enterAlwaysCollapsed”

    scroll 与 enterAlways 与 enterAlwaysCollapsed 结合所产的效果图如下:

    这里写图片描述

    xml中Toolbar 的布局和(4)还是一样的,不过app:layout_scrollFlags属性,由原来的exitUntilCollapsed改为enterAlwaysCollapsed。

    PS:还是从产生的效果角度去分析的:默认toolbar 显示的正常高度值我们设置成的100dp,当我们上滑的时候,toolbar直到完全隐藏时,下面的滚动布局才开始发生滚动;下滑时toolbar会优先滑出设置的最小高度值,然后当滚动布局下滑到顶部时,后面的toolbar部分,才开始完全显示(滑)出来。该属性感觉实用性也不强。

    与CollapsingToolbarLayout结合的使用

    (1):先看下效果图:
    这里写图片描述

    再把代码贴上:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 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="match_parent"
        android:fitsSystemWindows="true">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:fitsSystemWindows="true"
            android:theme="@style/AppTheme.NoActionBar.AppBarOverlay">
    
             <!--本次重点关注这里 CollapsingToolbarLayout -->
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/toolbar_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:layout_scrollFlags="scroll">
    
                <ImageView
                    android:id="@+id/image"
                    android:layout_width="match_parent"
                    android:layout_height="180dp"
                    android:scaleType="centerCrop"
                    android:src="@drawable/ic_image"
                    app:layout_collapseMode="parallax" />
    
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:navigationIcon="@drawable/ic_back_white_24dp"
                    app:popupTheme="@style/AppTheme.NoActionBar.PopupOverlay"
                    app:title="标题"
                    app:titleTextColor="@color/white">
    
    
                </android.support.v7.widget.Toolbar>
    
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/text_margin"
                android:text="@string/large_text" />
    
        </android.support.v4.widget.NestedScrollView>
    
    
    </android.support.design.widget.CoordinatorLayout>
    

    这里我们重点关注 CollapsingToolbarLayout控件 以下的几个属性:

    • app:contentScrim=”?attr/colorPrimary” 当上滑到toolbar 高度期间直到达到toolbar高度时,给toolbar设置的背景色,以及过渡颜色。当然,这里不仅仅可以设置颜色,也可以设置图片。 如果不设置该属性,标题栏会过渡为以之前的图片为背景。
    • app:layout_scrollFlags=”scroll” 和介绍 AppBarLayout 时,给Toolbar 设置和配置一样。其效果上图已做展示。
    • app:expandedTitleGravity=”center_horizontal” 从单词意思可以看出,这是展示后,title的位置。
    • app:expandedTitleMarginStart=”50dp” 从单词意思可以看出,这是展示后,title 距离开始位置的边距。
    • app:collapsedTitleGravity=”center” 从单词意思可以看出,这是收缩后,title 位置(测试发现,不好用)。
    • app:expandedTitleTextAppearance=”@style/transparentText” 展开后标题文字的样式
    • app:collapsedTitleTextAppearance=”@style/ToolbarTitle” 折叠后标题文字的样式

    给 ImageView 控件 设置的 app:layout_collapseMode=”parallax” 属性说明:
    app:layout_collapseMode有两个参数:

    • parallax 子View可以选择在当前的布局当时是否以“视差”的方式来跟随滚动。(PS:其实就是让这个View的滚动的速度比其他正常滚动的View速度稍微慢一点)。
    • pin 测试发现,按照以上的布局,如果你使用pin参数,看效果,和使用parallax 参数,好像没有什么区别。目前个人认为的区别后面在做介绍。

    注意事项:

    1.上图中背景图,也就是xml中的 ImageView 控件,设置的图片大小,在保证显示正常的情况下,越小越好。太大的话,在展示的时候,会有卡顿的感觉。


    下面我们来看一个效果图:
    这里写图片描述

    如果你发现展开和折叠后的标题字体太小或太大,你可通过如下两个属性设置:

     app:expandedTitleTextAppearance="@style/transparentText" 展开后标题文字的样式  
     app:collapsedTitleTextAppearance="@style/ToolbarTitle" 折叠后标题文字的样式
    

    transparentText (透明)样式:

    <style name="transparentText" parent="TextAppearance.AppCompat.Small">
            <item name="android:textColor">#00000000</item>
             <item name="android:textSize">15sp</item>
        </style>
    

    ToolbarTitle样式:

    <style name="ToolbarTitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
           <item name="android:textColor">#f0f0</item>
            <item name="android:textSize">15sp</item>
        </style>

    细心的你,会发现我们的状态栏,现在是完全透明的状态。那我们怎么实现呢?那你会说了,那还不简单!
    使用下面的代码:

     //透明状态栏效果
            if (Build.VERSION.SDK_INT >= 21) {
                View decorView = getWindow().getDecorView();
                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
                decorView.setSystemUiVisibility(option);
                getWindow().setStatusBarColor(Color.TRANSPARENT);
    
            }

    不就能实现吗!或者使用第三方 透明状态栏设置库。很简单的就能实现了。如果你真正具体操作了,运行代码了。你会发现,是实现不了的。不过你把上述代码中 ImageView 控件的 app:layout_collapseMode 的参数设置为 pin 。如下:
    app:layout_collapseMode=”pin” 。此时你在试一下,就能实现上图的效果啦。现在也能说明,parallax 和 pin 的一个区别吧。

    app:layout_scrollFlags=”scroll|enterAlways”

    那么 app:layout_scrollFlags=”scroll|enterAlways” 效果怎样呢?下面看图说话:

    这里写图片描述

    PS:这里也不再多说了,原理和介绍 AppBarLayout 时,给Toolbar 设置和配置基本差不多。

    app:layout_scrollFlags=”scroll|exitUntilCollapsed”

    效果图:
    这里写图片描述

    app:layout_scrollFlags=”scroll|enterAlways|exitUntilCollapsed”

    PS:这里不再贴出效果图啦,聪明的你,相信也能想象出其效果。(不过这样结合的配置,感觉不常用也不太实用。上面贴图的几种效果,还比较实用一些。)

    文章写了好几天,才算写的个差不多,如果对你有些帮助的话,给个赞和好评吧!

    引申拓展—–实现悬浮栏的效果

    如何自定义Toolbar 标题栏


    ToolBar 的封装

    Android ToolBar 使用完全解析

    【android MaterialDesign】 用法总结

    Android 详细分析AppBarLayout的五种ScrollFlags

    展开全文
  • ToolBar的使用

    2016-08-20 20:20:43
    toolbar

    Toolbar作为ActionBar使用介绍

    本文介绍了在Android中将Toolbar作为ActionBar使用的方法.
    并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为ActionBar使用时需要注意的事项.

    使用support library的Toolbar

    Android的ActionBar每个版本都会做一些改变, 所以原生的ActionBar在不同的系统上看起来可能会不一样.
    使用support library版本的Toolbar可以让你的应用在多种设备类型上保持一致. support library中总是包含了最新的features.
    Android从5.0 (API Level 21)开始提供Material Design, 使用v7版本的Toolbar后, 在任何Android 2.1(API Level 7)以上的机器上都可以看到Material Design风格的Toolbar.

    在Activity中使用Toolbar

    1.首先项目gradle中添加:

    compile 'com.android.support:appcompat-v7:23.4.0'

    2.确保Activity继承AppCompatActivity
    3.在application设置中使用NoActionBar的主题:

    <application
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        />

    4.把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"/>

    5.在Activity里面把Toolbar设置成为ActionBar
    首先把Toolbar find出来, 然后调用setSupportActionBar方法
    把Toolbar设置为自己的ActionBar即可.

    public class ToolbarDemoActivity extends AppCompatActivity {
    
        @BindView(R.id.toolbar)
        Toolbar toolbar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_toolbar_demo);
            ButterKnife.bind(this);
            setSupportActionBar(toolbar);
        }
    }

    然后就可以随意使用啦, 用getSupportActionBar可以获取ActionBar类型的对象, 从而使用ActionBar的方法.

    添加Action Buttons

    定义menu:

    <?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_android"
            android:icon="@drawable/ic_android_black_24dp"
            android:title="@string/action_android"
            app:showAsAction="always" />
        <item
            android:id="@+id/action_favourite"
            android:icon="@drawable/ic_favorite_black_24dp"
            android:title="@string/action_favourite"
            app:showAsAction="ifRoom" />
        <item
            android:id="@+id/action_settings"
            android:title="@string/action_settings"
            app:showAsAction="never" />
    </menu>

    然后在代码中inflate和处理它的点击事件:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Log.i(TAG, "onCreateOptionsMenu()");
        getMenuInflater().inflate(R.menu.menu_activity_main, menu);
        return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_android:
                Log.i(TAG, "action android selected");
                return true;
            case R.id.action_favourite:
                Log.i(TAG, "action favourite selected");
                return true;
            case R.id.action_settings:
                Log.i(TAG, "action settings selected");
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    添加向上返回的action

    添加向上返回parent的action:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_toolbar_demo);
        ButterKnife.bind(this);
        setSupportActionBar(toolbar);
    
        // add a left arrow to back to parent activity,
        // no need to handle action selected event, this is handled by super
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    然后只需要在manifest中指定parent:

    <activity
        android:name=".toolbar.ToolbarDemoActivity"
        android:parentActivityName=".MainActivity"></activity>

    在Fragment中使用Toolbar

    在Fragment中使用Toolbar的步骤和Activity差不多.
    在Fragment布局中添加一个Toolbar, 然后find它, 然后调用Activity的方法来把它设置成ActionBar:

    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

    注意此处有一个强转, 必须是AppCompatActivity才有这个方法.
    但是此时运行到Fragment之后, 发现Toolbar上的文字和按钮全是Activity传过来的, 这是因为只有Activity的onCreateOptionsMenu()被调用了, 但是Fragment的并没有被调用.
    在Fragment中加上这句:

    setHasOptionsMenu(true);

    此时Fragment的onCreateOptionsMenu()回调会被调到了, 但是inflate出的按钮和Activity中的actions加在一起显示出来了.
    因为Activity的onCreateOptionsMenu()会在之前调用到.
    于是Fragment中的写成这样:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        Log.e(TAG, "onCreateOptionsMenu()");
        menu.clear();
        inflater.inflate(R.menu.menu_parent_fragment, menu);
    }

    即先clear()一下, 这样按钮就只有Fragment中设置的自己的了, 不会有Activity中的按钮.

    在嵌套的子Fragment中使用Toolbar

    前面已经介绍过, Fragment可以嵌套使用: Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误.
    那么在前面的Fragment中再显示一个子Fragment, 并且又带有一个不一样的Toolbar, 还需要哪些处理呢?
    首先, java代码中还是需要有:

    setHasOptionsMenu(true)
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

    然后根据是否需要菜单按钮, 覆写onCreateOptionsMenu()方法来inflate自己的menu文件即可.
    感觉和在普通的Fragment中使用Toolbar作为ActionBar并没有什么区别.
    但是如果你的多个Fragment有不同的Toolbar菜单选项, 如果你没有懂得其中的原理, 可能就会出现一些混乱.
    下面来解说一下相关的方法.

    onCreateOptionsMenu()方法的调用

    一旦调用

    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

    就会导致ActivityonCreateOptionsMenu()方法的调用, 而Activity会根据其中Fragment是否设置了setHasOptionsMenu(true)来调用Fragment的
    onCreateOptionsMenu()方法, 调用顺序是树形的, 按层级调用, 中间如果有false则跳过.

    假设当前Activity, Parent Fragment和Child Fragment中都设置了自己的Toolbar为ActionBar.
    在打开Child fragment的时候, onCreateOptionsMenu()的调用顺序是.
    Activity -> Parent -> Child. 此时parent和child fragment都设置了setHasOptionsMenu(true).

    关于这个, 还有以下几种情况:

    
    - 如果Parent的`setHasOptionsMenu(false)`, Child为true, 则Parent的`onCreateOptionsMenu()`不会调用, 打开Child的时候Activity -> Child.
    - 如果Child的`setHasOptionsMenu(false)`, Parenttrue, 则打开Child的时候仍然会调用Activity和Parent的onCreateOptionsMenu()方法.
    - 如果Parent和Child都置为false, 打开Parent和Child Fragment的时候都会调用Activity的onCreateOptionsMenu()方法.
    

    仅仅是child Fragment的show() hide()的切换, activity和parent Fragment的onCreateOptionsMenu()也会重新进入.
    这一点我还没有想明白, 是项目中遇到的, 初步推测可能是menu的显隐变化invalidate了menu, 改天有空再试试.

    上面的机制常常是导致Toolbar上面的按钮混淆错乱的原因.
    举个例子:
    如果我们现在Activity和Parent Fragment有不同的Toolbar按钮, 但是Child只有文字, 没有按钮.
    很显然我们不需要给child写menu文件, 也不需要覆写child里的onCreateOptionsMenu()方法.
    但是此时不管怎样, parent的onCreateOptionsMenu()方法都会被调用, 这样我们打开child的时候, toolbar上就神奇地出现了parent里的按钮.
    这种情况如何解决呢?
    可以在parent中加一个条件, 当没有child fragment的时候才做inflate的工作:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        Log.e(TAG, "onCreateOptionsMenu()");
        menu.clear();
        if (getChildFragmentManager().getBackStackEntryCount() == 0) {
            inflater.inflate(R.menu.menu_parent_fragment, menu);
        }
    }

    另外, 除了setSupportActionBar()之外, 如果我们想主动触发 onCreateOptionsMenu()方法的调用, 可以用
    invalidateOptionsMenu()方法.

    onOptionsItemSelected()方法的调用

    在Activity和其中的Fragment都有options menu的时候, 需要注意menu item的id不要重复.
    以为点击事件的分发也是从Activity开始分发下去的, 如果child fragment中有个选项的id和Activity中一个选项的id重复了, 则在Activity中就会将其处理, 不会继续分发.

    有嵌套Fragment时 Back键处理

    之前没有嵌套Fragment的情况下, 只要将Fragment加入到Back Stack中, 那么按下Back键的时候pop动作是系统自动做好的.
    虽然在添加child fragment的时候将其加入到back stack中, 但是按back键的时候仍然是将parent fragment弹出, 只剩下Activity.
    这是因为back键只检查第一层Fragment的back stack, 对于child fragment, 需要在其parent中自己处理.
    比如这样处理:

    在Activity中

    @Override
    public void onBackPressed() {
        Fragment fragment = getSupportFragmentManager().findFragmentById(android.R.id.content);
        if (fragment instanceof ToolbarFragment) {
            if (((ToolbarFragment) fragment).onBackPressed()) {
                return;
            }
        }
        super.onBackPressed();
    }

    其中ToolbarFragment是直接加在Activity中作为parent fragment的.
    在parent fragment中(即ToolbarFragment中):

    public boolean onBackPressed() {
        return getChildFragmentManager().popBackStackImmediate();
    }

    本文Demo地址: Demo on github
    其中的: ToolbarDemoActivity即为Toolbar Demo.
    本文地址: Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    展开全文
  • Toolbar使用方法

    千次阅读 2016-02-28 22:46:04
    Toolbar
  • 根据这个Toolbar来看,默认导入的类为: import android.widget.Toolbar; 记得以前改为java import android.support.v7.widget.Toolbar;就可以了,但是现在这种方案已经行不通了 最新解决方案如下: 在Activity中...
  • GoLand ToolBar

    2019-11-18 09:35:51
    默认GoLand不显示ToolBar,需要通过设置,显示ToolBar 默认状态: View -> Appearance -> 勾选 Toolbar
  • ToolBar详解

    2017-03-12 22:37:49
    ToolBar详解
  • toolbar使用

    2018-05-04 09:55:38
    Toolbar是Google在Android 5.0中推出的一款替代ActionBar的View。ActionBar必须得作为Activity内容的一部分,而Toolbar可以放在任何层次。Toolbar比ActionBar支持更多的功能ToolBar的setTitle()方法不生效解决方法...
  • ToolBar 的封装

    千次下载 热门讨论 2015-06-12 23:54:03
    ToolBar 的封装,使代码步重复,快捷开发
  • Adnroid Toolbar 自定义Toolbar布局

    万次阅读 2016-01-27 21:51:08
    默认调用系统的toolbar,分以下几个步骤: 在布局文件中添加toolbar 描述toolbar中menu的布局 在代码中调用 主布局文件: xmlns:tools="http://schemas.android.com/tools"
  • 简单说一下,为什么使用toolbar,安卓碎片化比较严重,在不同手机上显示的效果可能不一样,所以就有了toolbar toolbar 是一个ViewGroup 里面可以有一些基本的控件 比如说 : TextView (代码里面就有,请看代码) 首先有两种...
  • Ext.toolbar.Toolbar工具栏

    2017-10-25 10:51:08
    Ext.toolbar.Toolbar工具栏 1、Ext.toolbar.Toolbar主要配置项  Ext.toolbar.Toolbar配置 配置项 参数类型 说明 enableOverflow Boolean 设置为true则自动为工具栏添加一个...
  • Toolbar的简单介绍和如何简单自定义toolbar

    万次阅读 热门讨论 2015-11-29 20:43:10
    通过本篇可以了解到: 1.什么是ToolBar 2.ToolBar 的一些重要属性 3.如何自定义ToolBar
  • WebStorm显示toolbar和自定义toolbar

    千次阅读 2019-11-20 10:44:42
    在编码中有一些经常使用的功能,比如返回上一个光标的位置,使用快捷键也可以,不过在工具栏点击也很方便,但是在WebStorm默认是不显示toolbar的。百度还真没有解决,在这里记录一下 菜单栏 view->toolobar打勾...
  • Toolbar详解

    千次阅读 2016-10-14 17:55:21
    以我所了解的Toolbar是API v21也就是android5.0新特里面的控件,替代之前的ActionBar控件。Toolbar与ActionBar最大区别就在于Toolbar更加自由灵活。Toolbar添加样式需要在style.xml <!-- t
  • 关键函数:Toolbar 标题栏图标:navigationIcon 标题:Title 子标题栏:subTitle 注意事项:import androidx.appcompat.widget.Toolbar; import androidx.core.app.NotificationCompat;这个必须导入 <androidx....
  • Android ToolBar整合

    2017-02-16 10:06:27
    最近做项目中遇到ToolBar因为不同的界面toobar不同为了描述统一的风格相信大家也非常清楚,大多数ToolBar包括以下几个方面 左标题 左边题颜色 左标题图标等 标题 标题颜色 右标题 右标题颜色 右标题图标 ToolBar...
  • ,注意事项 项目是替换ActionBar 1...setSupportActionBar(toolbar) 问题:添加进去后menu菜单无法显示,调用setSupportActionBar后要在onCreateOptionsMenu方法中像ActionBar那样初始化菜单 解决:...
  • android toolbar

    2015-11-06 11:46:49
    推荐理由—actionbar的本地化导致其表现会因使用不同设备或版本而不同,而toolbar在support:appcompat_v7里。 应用 当成actionbar使用 当成ViewGroup使用 1 toolbar = (Toolbar) findViewById(R.id.toolbar); 2 ...
  • 使用Toolbar会变成全屏,明明高度已经设置成?attr/actionBarSize了 顺便求大佬告诉下toolbar的图标都是怎么弄得啊 例如导航栏 后退键 android:layout_height="match_parent" xmlns:android=...
  • 安卓 Toolbar

    2015-12-14 14:42:32
    Toolbar 简述 Toolbar 在v7.21+包中,是一个用来替代ActionBar的组件,可以说是ActionBar的升级版本。Toolbar与ActionBar比较有几个特点: ActionBar属于Window的装饰组件,一个activity中只能有一个ActionBar,...
  • 使用toolbar的情况和toolbar的优点 必须说明,toolbar使用简单,ui也好看。 home键可以很容易的和drawer联动 通过设置menu item 的展示选项控制overflow列表,这个极为常用 最重要的是,toolbar继承自viewgroup ...
  • WPF ToolBar

    千次阅读 2018-04-08 12:07:05
    如何隐藏ToolBar左侧的移动虚线和右侧的箭头上面的图是两个工具栏的链接处。 去除蓝色部分的方法是 设置工具栏的ToolBarTray.IsLocked附加选项为True 去除红色部分 这个需要修改空间模板,比较麻烦。一个解决...
  • 方法一:baseActivity不自带...1,创建一个toolbar布局 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width=
  • ToolBar入门

    千次阅读 2015-07-30 17:11:07
    ToolBar的入门
  • ToolBar概述

    千次阅读 2016-06-15 20:12:55
    使用ToolBar的话,一定要将当前Activity或者Application的Theme设置为NoActionBar样式,如,否则ActionBar和ToolBar两者都会显示,而且setSupportActionBar方法将会抛出异常,其实使用了ToolBar完全可以把ActionBar抛...
  • 安卓Toolbar

    2016-06-17 13:05:04
    Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android客户端的导航栏,以此来取代之前的 Actionbar 。与 Actionbar 相比,Toolbar 明显...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,158
精华内容 13,263
热门标签
关键字:

toolbar