Выделить пункт меню в ActionMenuView после щелчка

#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 не отображается и, таким образом, удаляет выделение