#android #android-toolbar #highlight #menuitem #actionmenuview
#Android #android-панель инструментов #выделите #элемент меню #actionmenuview просмотр меню действий #выделить #menuitem #actionmenuview
Вопрос:
Я использую ActionMenuView
для отображения набор фильтров, которые пользователь может выбрать. После выбора пункта меню в ActionMenuView
, я хочу, чтобы этот пункт меню был выделен до тех пор, пока не будет выбран другой пункт меню.
Как мне сохранить выделение пункта меню после того, как он был нажат? Желаемый результат возникает, когда я ставлю точку останова в onMenuItemClick
функции, она выглядит следующим образом:
РЕДАКТИРОВАНИЕ Решило проблему, смотрите мой ответ ниже
Ответ №1:
Мне удалось сделать это, изменив значки 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 amp;amp; 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 не отображается и, таким образом, удаляет выделение