Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改导航抽屉项颜色过滤器也更改使用相同图像id的imageView_Android_Kotlin_Kotlin Android Extensions - Fatal编程技术网

Android 更改导航抽屉项颜色过滤器也更改使用相同图像id的imageView

Android 更改导航抽屉项颜色过滤器也更改使用相同图像id的imageView,android,kotlin,kotlin-android-extensions,Android,Kotlin,Kotlin Android Extensions,在应用程序中,导航抽屉包含许多菜单项。限制是,有一个项目将显示其“着色颜色”的颜色实例,但另一个项目将显示“着色”。有了这个限制,我决定使用颜色过滤器来处理物品抽屉的图标颜色阶段。这条路走得很好 我的菜单是这样的 <item android:id="@+id/menu_main" android:icon="@drawable/ic_my_logo_24dp" android:title="@string/app_name" />

在应用程序中,导航抽屉包含许多菜单项。限制是,有一个项目将显示其“着色颜色”的颜色实例,但另一个项目将显示“着色”。有了这个限制,我决定使用颜色过滤器来处理物品抽屉的图标颜色阶段。这条路走得很好

我的菜单是这样的

    <item
        android:id="@+id/menu_main"
        android:icon="@drawable/ic_my_logo_24dp"
        android:title="@string/app_name" />
    <item
        android:id="@+id/menu_setting"
        android:icon="@drawable/ic_settings_black_24dp"
        android:title="@string/text_menu_settings" />
    <item
        android:id="@+id/menu_contact_us"
        android:icon="@drawable/ic_markunread_black_24dp"
        android:title="@string/text_menu_contact_us" />
    <item
        android:id="@+id/menu_faq"
        android:icon="@drawable/ic_faq_black_24dp"
        android:title="@string/text_menu_faq" />
fun setSelectedMenuItemColor(selectedId: Int) {
  val menu = binding?.navView?.menu
   repeat(menu!!.size()) { i ->
     menu.getItem(i)?.icon?.mutate()
     menu.getItem(i)?.icon?.colorFilter = when {
       menu.getItem(i).itemId == selectedId && selectedId == R.id.menu_main -> null
       menu.getItem(i).itemId == selectedId -> selectedFilterColor
       else -> idleFilterColor!!
     }
  }
}
问题是


如果我使用imageView并将drawable设置为与菜单项之一相同。颜色状态将随菜单项更改。我不想更改imageView的色调。但它会根据菜单项的不同而变化。然后,我在imageView中添加淡色以更改为不同的单色,但它仍然显示菜单的相同颜色。比如说

<ImageView
   android:tint="@color/black"
   android:src="@drawable/ic_settings_black_24dp" />

在这种情况下,imageView应仅显示黑色。但根据菜单显示为灰色或蓝色。

预期结果是imageView应该根据我在XML中设置的颜色着色

但结果是它显示了与菜单项相同的色调

我独立思考,有人能解释为什么会发生这个问题以及如何解决它吗
在项目中使用数据绑定和Kotlin

我从您的问题中了解到,对于菜单项和imageView,您需要将选定项的颜色更改为蓝色,将未选定项的颜色更改为灰色。您可以使用colorstatelist来执行此操作,而不是编写自己的逻辑来更改色调

通过此链接了解想法

总的来说,解决方案可能是

  • 创建颜色状态列表xml文件“selection_state.xml”

    
    

  • 将此背景应用于需要在屏幕上显示的视图


    谢谢大家帮助我。我终于找到了答案

    首先,
    menu.getItem(i)?.icon?
    可返回绘图。当在这个可绘制文件中使用固定内容时,可绘制文件是缓存,尽管当我尝试使用相同的图像ID时,它会返回缓存可绘制文件。为了修复它,只需调用方法
    drawable.mutate()
    ,以防止可绘制缓存。最后的代码应该是这样的

        <item
            android:id="@+id/menu_main"
            android:icon="@drawable/ic_my_logo_24dp"
            android:title="@string/app_name" />
        <item
            android:id="@+id/menu_setting"
            android:icon="@drawable/ic_settings_black_24dp"
            android:title="@string/text_menu_settings" />
        <item
            android:id="@+id/menu_contact_us"
            android:icon="@drawable/ic_markunread_black_24dp"
            android:title="@string/text_menu_contact_us" />
        <item
            android:id="@+id/menu_faq"
            android:icon="@drawable/ic_faq_black_24dp"
            android:title="@string/text_menu_faq" />
    
    fun setSelectedMenuItemColor(selectedId: Int) {
      val menu = binding?.navView?.menu
       repeat(menu!!.size()) { i ->
         menu.getItem(i)?.icon?.mutate()
         menu.getItem(i)?.icon?.colorFilter = when {
           menu.getItem(i).itemId == selectedId && selectedId == R.id.menu_main -> null
           menu.getItem(i).itemId == selectedId -> selectedFilterColor
           else -> idleFilterColor!!
         }
      }
    }
    

    使用
    app:srcCompat
    而不是
    android:src
    仍然相同。我不想更改imageView的色调。但它会根据菜单项的不同而变化。然后我在imageView中添加淡色以更改为不同的薄颜色,但它仍然显示menuI的相同颜色,因为您应用了淡色,这将应用于其中的所有子项。着色将应用于父级右侧。尝试为imageView设置淡色为空或透明@android:color/transparent。如果我将淡色应用于
    R.id.menu\u设置
    现在每个使用drawable
    @drawable/ic\u设置(黑色)\u 24dp
    的地方,它总是在菜单后更改淡色。但我不想。