关于ActionBar、Toolbar和菜单图标的问题
Questions about ActionBar, Toolbar and menu icons
假设选项卡式 activity 和 android:theme="@style/AppTheme.NoActionBar"
在 AppBarLayout 中有应用程序标题和一些 space 在右边。 Xml 文件如下。
如何向标题附近的空白 space 添加菜单项? (问题 1)
将样式更改为 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)
}
这是选项卡 activity 的布局。
<?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)
P.S。不要指望每个人都是专家。如果每个人都是专家,你在那个网站上做什么? Google 并非在所有情况下都可以回答。请记住,每个人都没有时间花几个小时搜索或尝试一些东西。有时剩下的唯一选择就是询问。如果您觉得有负担回答为什么不为专家建立自己的社区? (截至 2020 年 3 月的问题 3.6)
编辑:在 activity_main.xml 中使用 AndroidX 工具栏 (<androidx.appcompat.widget.Toolbar>
) 对我有用。看起来 setSupportActionBar()
需要 AndroidX Toolbar 并且无法将简单的 Toolbar 投射到其中。
- 将工具栏放在应用栏内:
<appbar>
<toolbar>
....
</toolbar>
</appbar>
然后将toolbar设置为actionbar,然后在onCreateOptionsMenu中inflate菜单:
setSupportActionBar(toolbar)
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu, menu)
return true
}
- 应该是'getSupportActionBar()'不是'getActionBar()'
- 不知道它是否更快,但是对于工具栏内的操作,最好使用 'menu' 方法 imo
假设选项卡式 activity 和 android:theme="@style/AppTheme.NoActionBar"
在 AppBarLayout 中有应用程序标题和一些 space 在右边。 Xml 文件如下。
如何向标题附近的空白 space 添加菜单项? (问题 1)
将样式更改为 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)
}
这是选项卡 activity 的布局。
<?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)
P.S。不要指望每个人都是专家。如果每个人都是专家,你在那个网站上做什么? Google 并非在所有情况下都可以回答。请记住,每个人都没有时间花几个小时搜索或尝试一些东西。有时剩下的唯一选择就是询问。如果您觉得有负担回答为什么不为专家建立自己的社区? (截至 2020 年 3 月的问题 3.6)
编辑:在 activity_main.xml 中使用 AndroidX 工具栏 (<androidx.appcompat.widget.Toolbar>
) 对我有用。看起来 setSupportActionBar()
需要 AndroidX Toolbar 并且无法将简单的 Toolbar 投射到其中。
- 将工具栏放在应用栏内:
<appbar>
<toolbar>
....
</toolbar>
</appbar>
然后将toolbar设置为actionbar,然后在onCreateOptionsMenu中inflate菜单:
setSupportActionBar(toolbar)
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu, menu)
return true
}
- 应该是'getSupportActionBar()'不是'getActionBar()'
- 不知道它是否更快,但是对于工具栏内的操作,最好使用 'menu' 方法 imo