如何在新的NavigationView中创建一个简单的分隔符?

Lon*_*ngi 149 android android-support-library navigation-drawer android-design-library navigationview

Google NavigationView在设计支持库版本22.2.0中引入了该版本,您可以使用菜单资源轻松创建抽屉.

如何在两个项目之间创建简单的分隔线?对项目进行分组不起作用.创建子项目部分会创建一个分隔线,但它需要一个我不想要的标题.

任何帮助,将不胜感激.

N J*_*N J 309

您需要做的就是group使用唯一ID定义一个,如果组具有不同的ID,我已经检查了实现,它将创建一个分隔符.

示例菜单,创建分隔符:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <group android:id="@+id/grp1" android:checkableBehavior="single" >
        <item
            android:id="@+id/navigation_item_1"
            android:checked="true"
            android:icon="@drawable/ic_home"
            android:title="@string/navigation_item_1" />
    </group>

    <group android:id="@+id/grp2" android:checkableBehavior="single" >
        <item
            android:id="@+id/navigation_item_2"
            android:icon="@drawable/ic_home"
            android:title="@string/navigation_item_2" />
    </group>
</menu>
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个问题是`setChecked`似乎在组级别工作.如果您选择A组中的项目,然后再次打开抽屉并选择B组中的项目,这两个项目将保持突出显示.也许Google会在下一个版本中修复此行为,但就目前而言,这是使用NavigationView多个组的缺点. (16认同)
  • 有趣的是,如果你从`group`中删除它,它将编译并运行但是分隔符是隐藏的. (12认同)
  • 不知道为什么这是(据我所知)没有记录.我想会被问到很多.谢谢! (9认同)
  • 这对我也不起作用.我想要菜单组之间的行,而不是每个项目之后. (5认同)
  • 大.关于双重检查,尝试`android:checkableBehavior ="none"`为你的第二组(这是行动,而不是导航,我假设) (3认同)

vbp*_*vbp 45

像这样创建一个可绘制的drawer_item_bg.xml,

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#F4F4F4" />
        </shape>
    </item>

    <item android:top="-2dp" android:right="-2dp" android:left="-2dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                android:width="1dp"
                android:color="#EAEAEA" />
        </shape>
        <!--
        android:dashGap="10px"
                android:dashWidth="10px"
                -->
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

并将其作为app添加到NavigationView :itemBackground ="@ drawable/drawer_item_bg"

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="#F4F4F4"
        android:layout_gravity="start"
        android:fitsSystemWindows="false"
        app:menu="@menu/activity_main_drawer"
        app:itemBackground="@drawable/drawer_item_bg"/>
Run Code Online (Sandbox Code Playgroud)

在这里我们去... 截图


SAN*_*NAT 16

简单添加DeviderItemDecoration:

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation);
NavigationMenuView navMenuView = (NavigationMenuView) navigationView.getChildAt(0);
navMenuView.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL));
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此输入图像描述

  • 每个项目的那种分隔符不遵循 Material Guyidelines (2认同)

小智 14

您可以使用通过XML设置菜单项背景来轻松添加分隔符 app:itemBackground

<android.support.design.widget.NavigationView
    android:id="@id/drawer_navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/all_navigation_menu"
    app:itemIconTint="@color/colorPrimary"
    app:itemBackground="@drawable/bg_drawer_item"
    android:background="@color/default_background"/>
Run Code Online (Sandbox Code Playgroud)

并使用LayerDrawable作为背景.它为点击保留了材料设计波纹覆盖.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
    <item android:left="@dimen/activity_horizontal_margin">
        <shape android:shape="rectangle">
            <solid android:color="@color/divider"/>
        </shape>
    </item>
    <item android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

  • 似乎是最好的答案,没有涉及任何小组 (2认同)

ple*_*xus 11

我想我有一个更好的解决方案来解决多个检查项目的问题.使用我的方式,您不必担心在向菜单添加新部分时更改代码.我的菜单看起来就像Jared编写的接受解决方案,区别在于使用andoid:checkableBehavior =" all ":

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/first_section" android:checkableBehavior="all">
        <item
            android:id="@+id/frontpage"
            android:icon="@drawable/ic_action_home_24dp_light_blue"
            android:title="@string/drawer_frontpage" />
        <item
            android:id="@+id/search"
            android:icon="@drawable/ic_search"
            android:title="@string/drawer_search" />
    </group>
    <group android:id="@+id/second_section" android:checkableBehavior="all">
        <item
            android:id="@+id/events"
            android:icon="@drawable/ic_maps_local_movies_24dp_light_blue"
            android:title="@string/drawer_events" />
    </group>
</menu>
Run Code Online (Sandbox Code Playgroud)

'all'的checkableBehavior使得可以随意检查/取消选中单个项目,而不管它们属于哪个组.您只需存储最后检查的menuitem.java代码如下所示:

private MenuItem activeMenuItem;

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
    // Update selected/deselected MenuItems
    if (activeMenuItem != null)
        activeMenuItem.setChecked(false);
    activeMenuItem = menuItem;
    menuItem.setChecked(true);

    drawerLayout.closeDrawers();
    return true;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

像Nilesh的答案那样制作不同的组会在两者之间形成分隔符但是会在导航器中创建两个已检查项目的问题.

我如何处理这个问题的简单方法是:

    public boolean onNavigationItemSelected(final MenuItem menuItem) {

    //if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item
    if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) {


        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true);
        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true);
       }else{

        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true);
        navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true);


    }
    //Update highlighted item in the navigation menu
    menuItem.setChecked(true);
}
Run Code Online (Sandbox Code Playgroud)

  • @espinchi - 如果其他组包含导航菜单项,那将无效.此解决方案仅适用于操作.不是很好的用户体验 (2认同)

AaA*_*AaA 7

我不确定这是固定的API 26 (Android 8)还是一直都有可能.我仍然是Android编程的菜鸟.但是我添加了如下的父组.在Android 6物理手机上测试,

  1. 我有分频器
  2. 从任一项中选择任何项目nav_g1nav_g2将取消选择其他项目.
  3. 由于嵌套组没有添加额外的填充.
  4. 我没有Java向听众添加任何代码

菜单代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <group
            android:id="@+id/nav_g1"
            android:checkableBehavior="single">
            <item
                android:id="@+id/nav_1"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_1"/>
            <item
                android:id="@+id/nav_2"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_2"/>
        </group>
        <group
            android:id="@+id/nav_g2"
            android:checkableBehavior="single">
            <item
                android:id="@+id/nav_3"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_3"/>
            <item
                android:id="@+id/nav_4"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_4"/>
        </group>
    </group>
    <item android:title="Actions">
        <menu>
            <item
                android:id="@+id/nav_7"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_7"/>
            <item
                android:id="@+id/nav_8"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/nav_8"/>
        </menu>
    </item>
</menu>
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 回答中所述,每个组都需要有一个唯一的ID来显示分隔符.
  2. 根据这个答案,空间与谷歌材料设计规格相匹配.
  3. 拥有android:checkableBehavior="single"父组是必需的,所以这个答案中的多个选定菜单项的问题(由hungryghost评论中提到)不会发生

这是截图

设备屏幕的屏幕截图


Jus*_*ler 5

我想要在第一个项目之上和最后一个项目之后的分隔符.使用@Nilesh解决方案我不得不添加虚拟菜单项并将enabled设置为false,感觉非常脏.如果我想在我的菜单中做其他很酷的东西呢?

我注意到NavigationView扩展了FrameLayout,因此您可以将自己的内容放入其中,就像使用FrameLayout一样.然后我设置一个空的菜单xml,以便它只显示我的自定义布局.我知道这可能违背了谷歌希望我们采取的路径,但如果你想要一个真正的自定义菜单,这是一个简单的方法.

<!--Note: NavigationView extends FrameLayout so we can put whatever we want in it.-->
<!--I don't set headerLayout since we can now put that in our custom content view-->
<android.support.design.widget.NavigationView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/empty_menu">

    <!--CUSTOM CONTENT-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- CUSTOM HEADER -->
        <include
            android:id="@+id/vNavigationViewHeader"
            layout="@layout/navigation_view_header"/>

        <!--CUSTOM MENU-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_below="@+id/vNavigationViewHeader">

            <View style="@style/NavigationViewLineSeperator"/>

            <Button android:text="Option 1"/>

            <View style="@style/NavigationViewLineSeperator"/>

            <Button android:text="Option 2"/>

            <View style="@style/NavigationViewLineSeperator"/>

        </LinearLayout>
    </RelativeLayout>
</android.support.design.widget.NavigationView>
Run Code Online (Sandbox Code Playgroud)

这是风格

<style name="NavigationViewLineSeperator">
        <item name="android:background">@drawable/line_seperator</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">1dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)

并且可绘制

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

    <solid android:color="@color/white"/>
    <size android:width="100sp"
          android:height="1sp" />
</shape>
Run Code Online (Sandbox Code Playgroud)

和菜单

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
</menu>
Run Code Online (Sandbox Code Playgroud)

编辑:

而不是按钮,您可以使用TextView与drawable模仿原始菜单项看起来:

 <TextView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:text="@string/menu_support"
     android:drawableLeft="@drawable/menu_icon_support"
     style="@style/MainMenuText" />

// style.xml
<style name="MainMenuText">
    <item name="android:drawablePadding">12dp</item>
    <item name="android:padding">10dp</item>
    <item name="android:gravity">center_vertical</item>
    <item name="android:textColor">#fff</item>
</style>
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

87981 次

最近记录:

6 年,7 月 前