Android技术知识Android知识Android开发

Material Design - Toolbar (二)

2017-10-20  本文已影响0人  Arnold_J

关键字:Toolbar、材料设计、ActionMenu
项目地址:AboutMaterialDesign


关于官方文档的介绍部分,我已经在上一篇写过,如果没有使用过 Toolbar 的话,可以先看看这篇:链接

好,那么下面,我们接着之前的 ActionMenu 内容测试。
先上几个效果图:


GIF.gif 效果图.png

一、测试效果1 - ActionMenuView

GIF.gif

这里主要有几个问题:


1.1 正确显示 MenuItem
标题依旧存在

通过一系列测试,我发现,这个获取 app_name 作为自己的 title 是在 onCreate - onResume 之间发生的,因此,我在 onResume 中调用了 mToolbar.setTitle(null) 期望能解决这个问题:

@Override
protected void onResume() {
    super.onResume();
    mToolbar.setTitle(null);
}

效果如下:


效果图.png

后来发现一个方法,不用在 onResume 里单独处理这个逻辑,放 onCreate 里就可以了,效果相同:

getSupportActionBar().setDisplayShowTitleEnabled(false);//不显示title
getSupportActionBar().setDisplayHomeAsUpEnabled(false);//不显示NavigationIcon
getSupportActionBar().setDisplayShowHomeEnabled(false);//不显示logo
<android.support.v7.widget.Toolbar
    android:background="@color/colorPrimary"
    android:id="@+id/activity_test1_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:title=""
    app:navigationIcon="@drawable/ic_back_light"
    app:popupTheme="@style/CustomPopupTheme"
    >
    <android.support.v7.widget.ActionMenuView
        android:id="@+id/activity_test1_toolbar_actionMenuViewId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"></android.support.v7.widget.ActionMenuView>
</android.support.v7.widget.Toolbar>
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.clear();
    getMenuInflater().inflate(R.menu.menu_action2, mActionMenuView.getMenu());
    return super.onCreateOptionsMenu(mActionMenuView.getMenu());
}
效果图.png
1.2 更改 MenuItem 默认宽度

这个样式目前我只找到了一个有效属性 android:actionButtonStyle

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>


    <item name="android:actionButtonStyle">@style/CustomActionButtonStyle</item>

</style>

<!-- Toolbar ActionButton 样式 -->
<style name="CustomActionButtonStyle" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:minWidth">72dp</item><!-- 默认值 56 -->
    <item name="android:padding">0dp</item>
    <item name="android:background">@drawable/selector_bg_toolbar_action_btn</item>
</style>
效果图.png
<!-- Toolbar ActionButton 样式 -->
<style name="CustomActionButtonStyle" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:minWidth">56dp</item><!-- 默认值 56 -->
    <item name="android:padding">0dp</item>
    <item name="android:background">@drawable/selector_bg_toolbar_action_btn</item>
</style>

二、测试效果2 - ActionLayout

效果图.png

我们知道,通常情况下, ActionMenu 在 Toolbar 中的作用是显示图片和文字。但是在很多时候,仅仅是图片文字,已经不能满足我们的需求,这个时候,我们需要 ActionLayout 这个属性,为我们导入自定义布局。

例如上图,为一个嵌套在 Toolbar 中的 SearchView。图中除了箭头,其他全都是一个自定义 layout 布局的内容。
附上 menu_action.xml 代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:title="搜索框"
        android:id="@+id/menu_action_search"
        android:orderInCategory="1"
        app:showAsAction="always"
        app:actionLayout="@layout/layout_menu_search"
        />
</menu>

注意,这里 actionLayout 属性需要引用 app 下的标签,而不是 android 下的标签,否则无法按照视图内容显示。

三、为什么我要去尝试 ActionMenu 实现这些效果

如题,事实上,这些东西本没有必要。因为 Toolbar 本身是一个容器,对于自定义的布局,我们只需要将它自带的所有布局隐藏,然后把自己的布局添加进来就可以了。例如:

<android.support.v7.widget.Toolbar
    android:id="@+id/activity_test2_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:navigationIcon="@drawable/ic_back_light"
    android:background="@color/colorPrimary"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="title"
        android:textSize="20sp"
        android:textColor="@android:color/white"/>
    
</android.support.v7.widget.Toolbar>

但是,上面的方法写几个 demo 大概并没有什么问题,但是在一个庞大的工程里,通常没有办法这么容易地解决一个问题。我们更提倡动态地添加,更提倡新建和复用而不是修改原来的代码。对于同一个问题,我们期待自己拥有更多的解决方案来适应不同的场景。

想努力让自己和自己的作品更好,想对每一行代码负责,想进步。

带着这样的愿景,我在想要不要奖励自己一点什么。


谢谢观赏
上一篇 下一篇

猜你喜欢

热点阅读