单击后突出显示 ActionMenuView 中的菜单项
Highlight menu item in ActionMenuView after click
我正在使用 ActionMenuView
来显示用户可以 select 的过滤器集。
在 select 编辑了 ActionMenuView
中的一个菜单项后,我希望突出显示该菜单项,直到 select 编辑了另一个菜单项。
单击菜单项后如何保持其高亮显示?
当我在 onMenuItemClick
函数中放置一个断点时,会出现预期的结果,如下所示:
编辑
问题解决了,看下面我的回答
我设法通过修改 ActionMenuView
的图标来做到这一点
使用 layer-list
(默认不突出显示):
<!-- drawable/filter_trade_requests_sort_by_creation_date.xml -->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_view_menu_base_currency_icon_background">
<shape android:shape="oval">
<solid android:color="#00000000" />
<size
android:width="100dp"
android:height="100dp" />
</shape>
</item>
<item
android:drawable="@drawable/ic_baseline_arrow_upward_24px"
android:gravity="center" />
</layer-list>
使用以下 ActionmenuView
:
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/fragment_trade_requests_app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.ActionMenuView
android:id="@+id/fragment_trade_requests_action_menu_view"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
选中ActionMenuView
中的某个图标后,我清除ActionMenuView
中所有图标的高亮,设置当前选中图标的高亮。
方法如下:
private fun setFilterIconHighLight(menuItem: MenuItem?, layerId: Int, color: Int) {
val icon = menuItem?.icon as? LayerDrawable
val background =
icon?.findDrawableByLayerId(layerId) as? GradientDrawable
background?.setColor(color)
}
private fun clearAllIconHighLights(menu: Menu) {
for (menuItem in menu.iterator()) {
val icon = menuItem.icon as? LayerDrawable
val nrOfLayers = icon?.numberOfLayers
if (nrOfLayers != null && nrOfLayers > 1) {
for (i in 0 until nrOfLayers) {
val layer = icon.getDrawable(i)
if (layer is GradientDrawable) {
layer.setColor(ColorUtils.setAlphaComponent(Color.WHITE, 0))
}
}
}
}
}
使用上面列出的可绘制对象,用法如下:
private fun updateFilterUI(binding: FragmentTradeRequestsBinding) {
val actionMenuView = binding.fragmentTradeRequestsActionMenuView.menu
// Some condition that indicates that we need to highlight
val menuItem = actionMenuView.findItem(R.id.filter_trade_requests_sort_by_creation_date)
clearAllIconHighLights(actionMenuView)
setFilterIconHighLight(
menuItem,
R.id.action_view_menu_date_icon_background,
ColorUtils.setAlphaComponent(Color.WHITE, 50)
)
}
alpha 值为 50 的颜色被认为是高光,而 alpha 值为 0 的颜色不可见并因此清除高光
我正在使用 ActionMenuView
来显示用户可以 select 的过滤器集。
在 select 编辑了 ActionMenuView
中的一个菜单项后,我希望突出显示该菜单项,直到 select 编辑了另一个菜单项。
单击菜单项后如何保持其高亮显示?
当我在 onMenuItemClick
函数中放置一个断点时,会出现预期的结果,如下所示:
编辑 问题解决了,看下面我的回答
我设法通过修改 ActionMenuView
的图标来做到这一点
使用 layer-list
(默认不突出显示):
<!-- drawable/filter_trade_requests_sort_by_creation_date.xml -->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_view_menu_base_currency_icon_background">
<shape android:shape="oval">
<solid android:color="#00000000" />
<size
android:width="100dp"
android:height="100dp" />
</shape>
</item>
<item
android:drawable="@drawable/ic_baseline_arrow_upward_24px"
android:gravity="center" />
</layer-list>
使用以下 ActionmenuView
:
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/fragment_trade_requests_app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.ActionMenuView
android:id="@+id/fragment_trade_requests_action_menu_view"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
选中ActionMenuView
中的某个图标后,我清除ActionMenuView
中所有图标的高亮,设置当前选中图标的高亮。
方法如下:
private fun setFilterIconHighLight(menuItem: MenuItem?, layerId: Int, color: Int) {
val icon = menuItem?.icon as? LayerDrawable
val background =
icon?.findDrawableByLayerId(layerId) as? GradientDrawable
background?.setColor(color)
}
private fun clearAllIconHighLights(menu: Menu) {
for (menuItem in menu.iterator()) {
val icon = menuItem.icon as? LayerDrawable
val nrOfLayers = icon?.numberOfLayers
if (nrOfLayers != null && nrOfLayers > 1) {
for (i in 0 until nrOfLayers) {
val layer = icon.getDrawable(i)
if (layer is GradientDrawable) {
layer.setColor(ColorUtils.setAlphaComponent(Color.WHITE, 0))
}
}
}
}
}
使用上面列出的可绘制对象,用法如下:
private fun updateFilterUI(binding: FragmentTradeRequestsBinding) {
val actionMenuView = binding.fragmentTradeRequestsActionMenuView.menu
// Some condition that indicates that we need to highlight
val menuItem = actionMenuView.findItem(R.id.filter_trade_requests_sort_by_creation_date)
clearAllIconHighLights(actionMenuView)
setFilterIconHighLight(
menuItem,
R.id.action_view_menu_date_icon_background,
ColorUtils.setAlphaComponent(Color.WHITE, 50)
)
}
alpha 值为 50 的颜色被认为是高光,而 alpha 值为 0 的颜色不可见并因此清除高光