【问题标题】:Questions about ActionBar, Toolbar and menu icons关于操作栏、工具栏和菜单图标的问题
【发布时间】:2020-03-03 01:38:03
【问题描述】:

假设带有android:theme="@style/AppTheme.NoActionBar" 的选项卡式活动

在 AppBarLayout 里面有应用标题和右边的一些空间。 xml文件如下。

如何将菜单项添加到标题附近的空白区域? (问题一)

将样式更改为android:theme="@style/AppTheme"(使ActionBar 再次出现)并删除标题TextView。出现了菜单项和图标,但操作栏看起来不太流畅,因为操作栏下方有阴影,使其看起来与选项卡分开。

因此,尝试通过在 MainActivity 的 onCreate() 内使用 actionBar!!.setBackgroundDrawable(...) 更改背景来消除色差,但出现空指针异常。 actionBar 没有初始化吗?我应该在哪里或如何调用此代码? (问题2)

还尝试通过<Toolbar>...</Toolbar>在xml文件中包围空白区域,以便我可以将标题放在此工具栏中并使用下面的代码将其定义为actionBar,但菜单图标仍然没有出现(onCreateOptionsMenu被覆盖在里面MainActivity):

 val actionbar = toolBar // possible to skip findViewById
 setSupportActionBar(actionbar)
.
.
.
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.mainmenu, menu)
    return super.onCreateOptionsMenu(menu)
}

这是选项卡式活动的布局。

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        android:id="@+id/appBarMain">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="8dp"
        android:text="@string/app_name"
        android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="36dp"
            android:background="?attr/colorPrimary">

        <com.google.android.material.tabs.TabItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="TEXT1" />

        <com.google.android.material.tabs.TabItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="TEXT2"/>

        <com.google.android.material.tabs.TabItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="TEXT3"/>

        </com.google.android.material.tabs.TabLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_dialog_email" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

奖励:如果我在 AppBarLayout 中放置一个 ConstraintLayout 并将 clickListener 设置到菜单图标的图像视图上,它会比 ActionBar 的 onOptionsItemSelected 更快吗?如果是的话有多快? (问题3)

附:不要指望每个人都是专家。如果每个人都是专家,你在那个网站上做什么?谷歌并不是在所有情况下都能回答。请记住,每个人都没有奢侈的时间花数小时搜索或尝试事物。有时剩下的唯一选择就是询问。如果您觉得回答有负担,为什么不为专家建立自己的社区? (截至 2020 年 3 月的问题 3.6)

编辑:在 activity_main.xml 中使用 AndroidX 工具栏 (&lt;androidx.appcompat.widget.Toolbar&gt;) 对我有用。看起来setSupportActionBar() 需要AndroidX Toolbar 并且不能将简单的Toolbar 投射到其中。

【问题讨论】:

    标签: android kotlin android-actionbar android-toolbar android-tabbed-activity


    【解决方案1】:
    1. 把工具栏放在appbar里面:
       <appbar>
         <toolbar>
         ....
         </toolbar>
       </appbar>
    

    然后将toolbar设置为actionbar,然后在onCreateOptionsMenu中膨胀菜单:

    setSupportActionBar(toolbar)

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
            menuInflater.inflate(R.menu.menu, menu)
            return true
    }
    
    1. 应该是“getSupportActionBar()”而不是“getActionBar()”
    2. 不知道是否更快,但对于工具栏内的操作,最好使用 imo 的“菜单”方法

    【讨论】:

    • 我使用 AndroidX 工具栏而不是工具栏,并且答案 1 有效。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多