gpt4 book ai didi

Android:itemBackground 的 NavigationView 选择器

转载 作者:行者123 更新时间:2023-11-29 19:34:28 25 4
gpt4 key购买 nike

我有一个 NavigationView,里面有很多项目。

我正在尝试更改所选(已选中)项目的背景。我有一个选择器可以更改 itemTextColor 并且工作正常。

我有一个可绘制资源:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/selected_item_accent"/>
</shape>

还有我的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/nav_view_background" android:state_checked="true" />
<item android:drawable="@drawable/nav_view_background" android:state_pressed="true" />
<item android:drawable="@android:color/transparent" />
</selector>

最后是 NavigationView

<android.support.design.widget.NavigationView
android:id="@+id/navView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/window_background"
app:itemTextColor="@drawable/selector_nav_view_text"
app:itemBackground="@drawable/selector_nav_view_background"
app:headerLayout="@layout/app_nav_header" />

按下状态按预期工作,但所选项目背景没有改变。

我想知道我在这里做错了什么。谢谢。

最佳答案

搜索结果

Change the color of a checked menu item in a navigation drawer

但我不认为它会工作,因为在源代码中,它从未设置 RecyclerView 的真实项目(不是菜单项目)检查。这意味着当您单击该项目时,只有菜单项被选中。所以背景当然不会变。

解决方法

NavigationView 似乎不是为你想要的设计的。设计者可能认为,当用户单击 NavigationView 中的项目时,它应该关闭,应用程序会将用户导航到另一个页面。所以不需要setChecked()

但是有一个使用反射的解决方法。核心代码是这样的

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_menu_item_1:
// find out the position of the menu item in Adapter
// in my test demo, positionInAdapter = positionInMenu + 2
int positionInAdapter = NUMBER;
try {
Field presenterField = mNavigationSpan.getClass().getDeclaredField("mPresenter");
presenterField.setAccessible(true);
// get NavigationMenuPresenter from your NavigationView
NavigationMenuPresenter presenter = (NavigationMenuPresenter) presenterField.get(mNavigationSpan);
Field menuViewField = presenter.getClass().getDeclaredField("mMenuView");
menuViewField.setAccessible(true);
// get NavigationMenuView from NavigationMenuPresenter, it is a RecyclerView which contains the real items user seen
NavigationMenuView menuView = (NavigationMenuView) menuViewField.get(presenter);
// using RecyclerView.findViewHolderForAdapterPosition() to get the ViewHolder, then you can get the itemView
menuView.findViewHolderForAdapterPosition(positionInAdapter).itemView.setSelected(true);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
break;
}
return false;
}
});

注意事项

  1. 因为 ViewHolder.itemView 是一个没有 setChecked 方法的 View ,所以我们使用 selected 而不是 checked;所以你需要要更改背景可绘制 xml,只需将 android:state_checked 更改为 android:state_selected
  2. 使用反射不是一个好主意,我建议您编写自己的布局来满足您的需求,而不是使用 NavigationView。

关于Android:itemBackground 的 NavigationView 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39402150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com