Android 在NavigationView上使用itemBackground的涟漪效应

Android 在NavigationView上使用itemBackground的涟漪效应,android,navigation-drawer,navigationview,Android,Navigation Drawer,Navigationview,我想知道是否有人在使用app:itemcondground“”重新定义NavigationView上项目的背景时遇到问题?我会看到屏幕截图上显示的行为,无论我按哪个项目,最后一个项目都会显示涟漪 这是我的抽屉菜单.xml: <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group androi

我想知道是否有人在使用
app:itemcondground“
”重新定义NavigationView上项目的背景时遇到问题?我会看到屏幕截图上显示的行为,无论我按哪个项目,最后一个项目都会显示涟漪

这是我的
抽屉菜单.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single" android:id="@+id/first_group">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_home"
            android:title="@string/nav_home" />
    </group>

    <group android:id="@+id/second_group">
        <item
            android:id="@+id/nav_settings"
            android:title="@string/nav_settings" />
        <item
            android:id="@+id/nav_about"
            android:title="@string/nav_about" />
        <item
            android:id="@+id/nav_logout"
            android:title="@string/nav_logout" />
    </group>

</menu>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="#ffff0000">
    <item
        android:id="@android:id/mask"
        android:drawable="@android:color/white" />
</ripple>
我的导航视图:

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@android:color/white"
    app:headerLayout="@layout/drawer_header"
    app:itemBackground="@drawable/my_ripple"
    app:itemIconTint="@color/drawer_item"
    app:itemTextColor="@color/drawer_item"
    app:menu="@menu/drawer_menu" />


Ripple Drawable的定义应如下示例所示:

 <!-- A red ripple masked against an opaque rectangle. -->
 <ripple android:color="#ffff0000">
   <item android:id="@android:id/mask"
         android:drawable="@android:color/white" />
 </ripple>

阅读更多


项背景
属性应用于
菜单
而不是
导航视图
。然后,涟漪将保留在处理触摸事件的菜单项中。

目前可能的解决方法-仅适用于查看的人,以防万一

在onCreate中为导航视图添加addOnGlobalLayoutListener,并在每个菜单项上应用Drawable

/**
 * Contains the {@link MenuItem} views in the {@link NavigationView}
 */
private final ArrayList<View> mMenuItems = new ArrayList<>(5);

    // Grab the NavigationView Menu
    final Menu navMenu = mNavigationView.getMenu();
    mNavigationView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Remember to remove the installed OnGlobalLayoutListener
            mNavigationView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            // Loop through and find each MenuItem View
            for (int i = 0, length = 5; i < length; i++) {
                final MenuItem item = navMenu.getItem(i);
                mNavigationView.findViewsWithText(mMenuItems, item.getTitle(), View.FIND_VIEWS_WITH_TEXT);
            }
            // Loop through each MenuItem View and apply your custom Typeface
            for (final View menuItem : mMenuItems) {
              //Create RippleDrawable called myRipple 
                ((TextView) menuItem).setBackground(myRipple);
            }
        }
    });
/**
*包含{@link NavigationView}中的{@link MenuItem}视图
*/
私有最终ArrayList mMenuItems=新ArrayList(5);
//抓取NavigationView菜单
最终菜单navMenu=mNavigationView.getMenu();
mNavigationView.getViewTreeObserver().addOnGlobalLayoutListener(新ViewTreeObserver.OnGlobalLayoutListener()){
@凌驾
公共图书馆{
//请记住删除已安装的OnGlobalLayoutListener
mNavigationView.getViewTreeObserver().removeOnGlobalLayoutListener(此);
//循环查找每个菜单项视图
for(int i=0,length=5;i
Woops抱歉!这正是我的代码,我复制错了,编辑了问题。你能发布你的“菜单”吗“文件?@Javier你有没有找到ripple为NavigationView工作的解决方案?是的,它现在可以与com.android一起工作。支持:设计:23.4.0你找到解决方案了吗?使用com.android.support:design:23.4.0,问题仍然存在……在哪里应用它menu@user3138859-将
itemBackground
属性直接添加到
菜单
资源定义中。在本例中,此资源是在
drawer\u menu.xml
中定义的。您从何处获取“mMenuItems”?