单击后,在ActionMenuView中突出显示菜单项

问题描述 投票:0回答:1

我正在使用ActionMenuView来显示用户可以选择的过滤器集。在ActionMenuView中选择菜单项后,我希望此菜单项被突出显示,直到选择了另一个菜单项。

单击后如何保持菜单项的突出显示?当我在onMenuItemClick函数中放置断点时,会出现所需的结果,如下所示:

Desired Result

编辑解决了问题,请参阅下面的答案

android android-toolbar highlight menuitem actionmenuview
1个回答
0
投票

我设法通过使用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))
                }
            }
        }
    }
}

使用上面列出的drawable,用法如下:

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的颜色不可见,因此会清除高光

© www.soinside.com 2019 - 2024. All rights reserved.