如何为Android菜单项添加分隔线

37

我的菜单项变得更大了,所以我想对它们进行分组,并添加一个分隔线来区分每个组。现在我该怎么办?

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
<!--group1-->
            <item
                android:id="@+id/action_addtag"
                android:title="@string/add_hashtag_string"
                app:showAsAction="never" />
            <item
                android:id="@+id/action_block_list"
                android:title="Block"
                app:showAsAction="never" />
            <item
                android:id="@+id/action_report_list"
                android:title="Report"
                app:showAsAction="never" />
<!--group2-->
            <item
                android:id="@+id/terms"
                android:title="Terms"
                app:showAsAction="never" />
            <item
                android:id="@+id/feedback"
                android:title="FeedBack"
                app:showAsAction="never" />
<!--group3-->
            <item
                android:id="@+id/action_setting"
                android:title="Setting"
                app:showAsAction="never" />
    </menu>

这对我有用。 - Ubirajara Erthal
5个回答

92

当你调用菜单时,请确保使用MenuCompat.setGroupDividerEnabled(menu, true);,否则组之间将没有分隔线

示例:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_activity_main, menu);

    MenuCompat.setGroupDividerEnabled(menu, true);

    return true;
}

请确保在您的菜单xml中拥有不同的组,例如:

    <menu>
        <group android:id="@+id/sorting" >
            <item
                android:id="@+id/action_sorting_new_old"
                android:title="@string/action_sorting_new_old"/>

            <item
                android:id="@+id/action_sorting_a_z"
                android:title="@string/action_sorting_a_z"/>
        </group>

        <group android:id="@+id/settings">
            <item
                android:id="@+id/action_settings"
                android:title="@string/action_settings"/>
        </group>
    </menu>

12
哈利路亚!这是似乎互联网上所有其他答案缺失的关键!非常感谢。 - technicalflaw
6
此外,每个群组必须有一个“ID”。 - Muntashir Akon
2
@MuntashirAkon谢谢您指定需要一个id。我花了很长时间不知道为什么分隔线没有显示出来。 - automaton

40

你只需要定义一个带有唯一标识符的分组,如果分组具有不同的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">
    <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">
    <item
        android:id="@+id/navigation_item_2"
        android:icon="@drawable/ic_home"
        android:title="@string/navigation_item_2" />
</group>

希望这能帮到你

更新

对于菜单项,也许你可以使用这个

    <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">
    <item
        android:id="@+id/action_cart"
        android:title="cart"
        android:actionLayout="@layout/cart_update_count"
        android:icon="@drawable/shape_notification"
        app:showAsAction="always"/>
</menu>

操作布局文件将会是:

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <View
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/divider"/>

    <TextView
        android:id="@android:id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/selectableItemBackground"
        android:gravity="center_vertical"          
        android:textAppearance="?attr/textAppearanceListItemSmall"/>

</LinearLayout>

7
我尝试了这种方法,但是我没有看到分割线。似乎它不适用于菜单项,只适用于抽屉导航器。 - mdtuyen
2
抱歉Vivid Vervet先生,我在Android 4.0和5.0上检查了一下,这个解决方案没有起作用 :( - mdtuyen
我将 app:showAsAction="never"app:actionLayout="@layout/cart_update_count" 进行了更改。 - mdtuyen
这在我的Android 7.0上有效 - 值得注意的是,如果您没有为每个组设置ID,则这些行不会出现,这让我感到困惑。 - BasicPleasureModel
在旧版本的Android上,您还需要调用MenuCompat.setGroupDividerEnabled,如下面的答案所示。 - mhsmith

6

虽然这是一个旧问题,但以上的答案对我并不起作用(而且我反对为单个项目添加“组”)。

成功的方法是添加如下的样式元素:

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar"> <!--  .Light.DarkActionBar"> -->
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">#17161B</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:dropDownListViewStyle">@style/PopupMenuListView</item>//<-add this
    </style>

引用了

    <style name="PopupMenuListView" parent="@style/Widget.AppCompat.ListView.DropDown">
        <item name="android:divider">#dddddd</item>
        <item name="android:dividerHeight">1dp</item>
    </style>

在同一个res/values/styles.xml文件中。希望这能有所帮助!


5
如果您需要在溢出菜单中(右侧的省略号)添加垂直线,请执行以下操作:
假设您已经添加了一个新的菜单资源文件,请按照以下步骤进行操作。
  1. Group menu items and assign a unique ID to each group

    <group android:id="@+id/group1">
      <item
         android:id="@+id/action_about"
         android:orderInCategory="100"
         android:title="@string/about"
         app:showAsAction="never" />
     </group>
    
    <group android:id="@+id/group2">
     <item
         android:id="@+id/action_settings"
         android:orderInCategory="200"
         android:title="@string/settings"
         app:showAsAction="never" />
    </group>
    
  2. When you inflate the menu in the Activity's oncreate method:

    getMenuInflater().inflate(R.menu.main, menu);//inflate menu
    
    MenuCompat.setGroupDividerEnabled(menu, true);//add horizontal divider
    

-1

这对我来说完全有效...

<item
    android:title="@string/divider"
    MetaJsoup:showAsAction="ifRoom|withText" />
    
<string name="divider">-------------</string>

菜单中没有这样的标签。 - Al Ro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接