Я использую ActionMenuView для отображения набора фильтров, которые может выбрать пользователь.
После выбора пункта меню в ActionMenuView я хочу, чтобы этот пункт меню был выделен до тех пор, пока не будет выбран другой пункт меню.
Как сохранить выделение пункта меню после нажатия на него?
Желаемый результат возникает, когда я ставлю точку останова в функции 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)
)
}
Цвет со значением альфа 50 считается бликом, в то время как цвет со значением альфа 0 не виден и, таким образом, очищает выделение.