NavigationView — установка `app:itemBackground` приводит к тому, что элементы меню теряют начальное заполнение

У меня возникла проблема при настройке app:itemBackground для NavigationView. Я пытаюсь создать собственный фон для выбранного пункта меню. Пользовательский фон работает, но когда я его использую, он, кажется, убивает начальное заполнение пунктов меню.

Без фона (по умолчанию)

введите здесь описание изображения

С пользовательским фоном введите здесь описание изображения

Вы можете видеть, что пункты меню находятся на одном уровне слева от меню, когда установлено itemBackground.

Вот соответствующий xml...

макет

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/DrawerLayout"
    android:fitsSystemWindows="false">
<!-- your content layout -->
    <include
        layout="@layout/MainLayout" />
    <android.support.design.widget.NavigationView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/primary_color"
        android:id="@+id/NavigationView"
        app:itemTextColor="?android:textColorPrimary"
        app:headerLayout="@layout/navigationheaderlayout"
        app:itemBackground="@drawable/navigation_item_selector"
        app:menu="@menu/navigation_menu" />
</android.support.v4.widget.DrawerLayout>

селектор

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/navigation_item_selected_background" android:state_selected="true" />
   <item android:drawable="@drawable/navigation_item_selected_background" android:state_pressed="true" />
   <item android:drawable="@drawable/navigation_item_selected_background" android:state_checked="true" />
   <item android:drawable="@drawable/navigation_item_not_selected_background" />
</selector>

выбранный фон

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:left="0dp" 
        android:right="2dp" 
        android:drawable="@color/accent_color" />

    <item 
        android:left="2dp" 
        android:right="2dp" 
        android:drawable="@color/navigation_selected_item_color" />
</layer-list>

не выбран фон

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item>
       <shape android:shape="rectangle">
           <solid android:color="@android:color/transparent" />
       </shape>
   </item>
</layer-list>

Кто-нибудь сталкивался с чем-то подобным раньше?


person Ryan Alford    schedule 29.02.2016    source источник
comment
Вам нужно оставить 1 пустую строку между абзацем и кодом. Я исправил это до вашего редактирования :)   -  person Laur Ivan    schedule 29.02.2016
comment
Спасибо... Мне было интересно, что, черт возьми, происходит   -  person Ryan Alford    schedule 29.02.2016
comment
ИМХО, вы переопределяете некоторые значения по умолчанию, используя метод drawable. Единственный известный мне способ увидеть, что происходит, — это использовать стето.   -  person Laur Ivan    schedule 29.02.2016


Ответы (2)


Обратите внимание, что приведенное ниже решение будет работать для версий до леденцов. Но добавит дополнительные отступы в леденец и выше. Чтобы избежать этого, используйте разные темы для разных версий.

После настройки app:theme устранена проблема с отступом слева.

<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="false"
        android:background="@drawable/your_menu_bg"
        app:itemBackground="@drawable/your_menu_item_bg"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"
        app:theme="@style/NavigationDrawerStyle"
        app:itemIconTint="@color/your_color"
        app:itemTextColor="@android:color/white"
        app:itemTextAppearance="?android:attr/textAppearanceLarge"/>

Это моя пользовательская тема.

<style name="NavigationDrawerStyle">
    <item name="android:paddingLeft">20dp</item>
</style>

Как применять разные темы для разных версий? Проверьте другую ссылку ниже.

Изменить тему в соответствии с версией Android

person Harry Aung    schedule 28.04.2016
comment
Потрясающий. Я проверю это сегодня вечером. - person Ryan Alford; 28.04.2016
comment
@RyanAlford это решение сработало для вас? Я столкнулся с той же проблемой, и это не помогает. - person RobGThai; 18.12.2016

Добавьте для версий Android 4 отступ в конец списка слоев в вашем чертеже.

Вот так:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:left="0dp" 
        android:right="2dp" 
        android:drawable="@color/accent_color" />

    <item 
        android:left="2dp" 
        android:right="2dp" 
        android:drawable="@color/navigation_selected_item_color" />
    <item>
        <shape android:shape="rectangle" >
            <padding android:left="12dp" android:right="12dp"/>
        </shape>
    </item>
</layer-list>
person gecko    schedule 26.10.2016