2015-06-21 4 views
36

Я пытаюсь добавить переключатель в MenuItem в NavigationView как этотКак добавить пользовательские представления в новом NavigationView

enter image description here

Я использовал атрибут actionViewClass, но он показывает только название.

<item 
android:id="@+id/navi_item_create_notifications_sound" 
android:title="Notifications Sounds" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
app:actionViewClass="android.support.v7.widget.SwitchCompat" 
app:showAsAction="always" /> 
+0

вы можете обратиться мой этот ответ http://stackoverflow.com/questions/30626324/navigationview-and-custom-layout/30644656#30644656 – Moinkhan

+0

ли вы решить эту проблему каким-то образом? –

+2

Решение теперь состоит в том, чтобы использовать DrawerLayout со старым NavigationDrawer, я не мог найти обходное решение с помощью NavigationVIew – atabouraya

ответ

57

The new support library 23.1

позволяет использовать настраиваемое представление для элементов в навигации View с помощью приложения: actionLayout или с помощью MenuItemCompat.setActionView()

enter image description here

Вот как мне удалось отобразить SwitchCompat

menu_nav.xml

<?xml version="1.0" encoding="utf-8"?> 

<group 
    android:id="@+id/first" 
    android:checkableBehavior="single"> 

    <item 
     android:id="@+id/navi_item_1" 
     android:icon="@drawable/ic_feed_grey_500_24dp" 
     android:title="Feed" /> 
    <item 
     android:id="@+id/navi_item_2" 
     android:icon="@drawable/ic_explore_grey_500_24dp" 
     android:title="Explore" /> 
    <item 
     android:id="@+id/navi_item_4" 
     android:icon="@drawable/ic_settings_grey_500_24dp" 
     android:title="Settings" /> 

</group> 
<group 
    android:id="@+id/second" 
    android:checkableBehavior="single"> 
    <item xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/navi_item_create_notifications_sound" 
     android:title="Notifications Sounds" 
     app:actionLayout="@layout/menu_swich" 
     app:showAsAction="always" /> 

</group> 

menu_switch.XML

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:gravity="right|center_vertical" 
    app:buttonTint="@color/colorPrimary" 
    app:switchPadding="@dimen/spacing_small" /> 

Чтобы получить вид и назначить события на него, вы должны сделать:

SwitchCompat item = (SwitchCompat) navigationView.getMenu().getItem(3).getActionView(); 
     item.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
      @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       Logr.v(LOG_TAG, "onCheckedChanged" + isChecked); 
      } 
     }); 
+0

очень информативно. Thnx. Как справиться с этим событием смены коммутатора? –

+7

Например, в этом представлении это 4-й элемент: SwitchCompat item = (SwitchCompat) navigationView.getMenu(). GetItem (3) .getActionView(); item.setOnCheckedChangeListener ( новый CompoundButton.OnCheckedChangeListener() { @Override общественного недействительными onCheckedChanged (CompoundButton buttonView, булево IsChecked) { Logr.v (LOG_TAG, "onCheckedChanged" + IsChecked); } }); – atabouraya

+0

ok. хороший ответ +1 –

1

Try обернуть коммутатор в отдельный файл макета:

Меню:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item 
    android:id="@+id/menu_switch" 
    android:title="Switch Title" 
    app:actionLayout="@layout/layout_my_switch" 
    app:showAsAction="always" /> 
</menu> 

Switch: "layout_my_switch.xml"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<android.support.v7.widget.SwitchCompat 
    android:id="@+id/my_switch" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" /> 
</RelativeLayout> 
+0

'app: showAsAction' & 'app: actionLayout' игнорируется в NavigationView – Gallal

+0

Хорошо, я не знал, что – HeW

+1

@Gallal вы должны использовать библиотеки поддержки 23.1.0 – krossovochkin

1

[Update 03- 03-2017] Ответ устарел. Не ссылайтесь на это. См. Принятый ответ.

К сожалению, в настоящее время NavigationView не так много возможности настройки ...

Вы должны принять Настроенный ListView внутри NavigationView.

<android.support.design.widget.NavigationView 
    android:id="@+id/navView" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</android.support.design.widget.NavigationView> 

И создать ячейку для этого ListView, взяв TextView на левую сторону и SwitchCompact на правую сторону.

Я надеюсь, что это поможет ...

-3

Вы ищете что-то вроде этого,

Тогда есть пользовательский компонент, доступный в Synfusion, называется Navigation drawer.

Вы можете найти соответствующую документацию here.

Человек.! они также предлагают Community license.

+2

он использует NavigationView –

+0

'NavigationDrawer' также является' NavigationView' с некоторые другие дополнительные функции в нем –

+0

, где мы можем осуществлять навигацию с «LeftToRight», «RightToLeft», «TopToBottom» и «BottomToTop» с различными переходами анимации –

2

Простое решение, как вы используете NavigationView

<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:menu="@menu/activity_main_drawer"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:orientation="horizontal"> 

     <android.support.v7.widget.SwitchCompat 
      android:id="@+id/mSwitch" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_margin="10dp" 
      android:text="Night Mode" /> 

    </LinearLayout> 

</android.support.design.widget.NavigationView> 
0

я использовал ниже макета в Ящика Layout где используется код просмотра навигации.

<android.support.design.widget.NavigationView 
     android:id="@+id/navi_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start|top" 
     android:background="@color/navigation_view_bg_color" 
     app:theme="@style/NavDrawerTextStyle"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <include layout="@layout/drawer_header" /> 

      <include layout="@layout/navigation_drawer_menu" /> 
     </LinearLayout> 
    </android.support.design.widget.NavigationView> 
Смежные вопросы