【问题标题】:How to add custom views in the new NavigationView如何在新的 NavigationView 中添加自定义视图
【发布时间】:2015-09-06 23:11:23
【问题描述】:

我正在尝试像这样在NavigationView 中添加一个开关作为菜单项

我使用了 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" />

【问题讨论】:

标签: android navigationview android-navigationview


【解决方案1】:

尝试将你的 Switch 包装到一个单独的布局文件中:

菜单:

<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>

开关:“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>

【讨论】:

  • 'app:showAsAction' & 'app:actionLayout' 在 NavigationView 中被忽略
  • 好吧我不知道
  • @Gallal 你应该使用 23.1.0 支持库
【解决方案2】:

[更新 03-03-2017] 答案已经过时了。不要参考这个。参考接受的答案。

不幸的是,目前 NavigationView 并没有太多允许自定义...

您必须在 NavigationView 中使用自定义 ListView。

<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>

并通过将 TextView 放在左侧并将 SwitchCompact 放在右侧来为此列表视图创建单元格。

希望对你有帮助……

【讨论】:

    【解决方案3】:

    你在寻找这样的东西吗,

    然后在Synfusion 中有一个自定义组件可用,称为Navigation drawer

    您可以找到相应的文档here

    伙计!他们也提供Community license

    【讨论】:

    • 他使用 NavigationView
    • NavigationDrawer 也是 NavigationView,其中包含一些其他附加功能
    • 我们可以从LeftToRightRightToLeftTopToBottomBottomToTop导航到各种动画过渡
    • 但是你为什么要谈论 Symfusion,因为他使用的是标准的 Android?
    • 只是一个可用于使用自定义 NavigationView 的选项,而不是在原生 Android 中尝试复杂的工作方式
    【解决方案4】:

    The new support library 23.1

    允许使用app:actionLayoutMenuItemCompat.setActionView() 对导航视图中的项目使用自定义视图。

    这是我设法显示 SwitchCompat 的方法

    menu_nav.xml

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

    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);
                }
            });
    

    【讨论】:

    • 信息量很大。谢谢。如何处理该开关更改事件?
    • 例如在这个视图中它是第 4 项: 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); } });
    • @atabouraya .. 我有一个问题...SwichCompat 的拇指没有在选中和未选中时切换它们的位置,只有颜色变化
    • 我还有一个问题,您是如何设法使文本从菜单图标开始的同一点开始的?对我来说,文本与菜单中的所有文本对齐,左侧留下了很多空白空间
    • 我建议使用 getMenu().findItem(itemID) 方法来获取 menuItem 对象。
    【解决方案5】:

    使用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>
    

    【讨论】:

      【解决方案6】:

      我在使用了导航视图代码的抽屉布局中使用了下面的布局。

      <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>
      

      【讨论】:

        猜你喜欢
        • 2016-03-16
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        相关资源
        最近更新 更多