android - 将 NavigationView 背景更改为圆形在按下时不起作用

标签 android android-layout android-navigationview material-components material-components-android

我在布局中使用 app:itemBackground 设置导航项背景:

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:itemBackground="@drawable/nav_selector_background"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

这是nav_selector_background.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/colorNavItemSelected">
<item android:id="@android:id/mask">
    <color android:color="#000"/> <!-- any color will do -->
</item>

<item
        android:right="8dp">
    <selector>
        <item android:state_pressed="true" android:drawable="@drawable/nav_item_background_round"/>
        <item android:state_focused="true" android:drawable="@drawable/nav_item_background_round"/>
        <item android:state_checked="true" android:drawable="@drawable/nav_item_background_round"/>
        <item android:state_activated="true" android:drawable="@drawable/nav_item_background_round"/>
        <item android:state_active="true" android:drawable="@drawable/nav_item_background_round" />
        <item android:state_hovered="true" android:drawable="@drawable/nav_item_background_round" />
        <item android:state_drag_hovered="true" android:drawable="@drawable/nav_item_background_round" />
        <item android:drawable="@android:color/transparent"/>
    </selector>

</item>

nav_item_background_round:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@color/colorNavItemSelected"/>
            <corners android:bottomRightRadius="32dp"
                     android:topRightRadius="32dp"/>
        </shape>
    </item>
</layer-list>

问题是当我按下项目时,整个背景都突出显示,如屏幕截图所示。我只想突出显示红色部分。

enter image description here

我在 Github 上上传了样本如果有人有兴趣编译和运行该应用程序。

最佳答案

随着NavigationViewMaterialComponents libarry你可以使用:

  • app:itemShapeAppearanceOverlay 属性为每个项目定义自定义形状
  • app:itemShapeFillColor 属性定义用于填充形状的颜色

类似于:

  <com.google.android.material.navigation.NavigationView
      app:itemShapeFillColor="@color/selector_menu"
      app:itemShapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Nav"
      android:theme="@style/ThemeOverlay.NavigationView"
      ../>

选择器是这样的:

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

形状定义为:

  <style name="ShapeAppearanceOverlay.Nav" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopRight">50%</item>
    <item name="cornerSizeBottomRight">50%</item>
    <item name="cornerSizeBottomLeft">0dp</item>
    <item name="cornerSizeTopLeft">0dp</item>
  </style>

还可以使用 android:theme 来覆盖波纹使用的颜色。

  <style name="ThemeOverlay.NavigationView" parent="">
    <item name="android:colorControlHighlight">@android:color/transparent</item>
  </style>

enter image description here

关于android - 将 NavigationView 背景更改为圆形在按下时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53574593/

相关文章:

android - 类型参数 t 具有不兼容的上界 View 和 ListView

android - 更改默认导航菜单的颜色

android - Twitter SDK 请求代码

android - 通过随机键检索子值-Firebase

android - android 4.1.1 自定义通知中的选取框问题

java - setOnClickListener 错误

android - Home Fragment 部分可见,当前 Fragment Android Studio 的混合 View

android - 当另一个 fragment 在 android 中的一个 fragment 上打开时,如何禁用 fragment UI?

Android FCM 错误 FirebaseInstanceId : Error while delivering the message: ServiceIntent not found