如何水平对齐菜单项

14
如何创建像Google Chrome一样在第一行水平对齐的菜单项。

enter image description here

我创建了一个带有菜单子项的第一个项目,但是通过这种方式,我得到了一行将我发送到其他菜单,那么如何使用菜单文件实现这一点?我不想使用对话框。

这是我的菜单文件:

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

    <group android:id="@+id/toolbar_menu"
        android:visible="true">
    <item
        android:id="@+id/item_tabs"
        android:icon="@drawable/ic_tabs_24dp"
        android:title="@null"
        app:showAsAction="always"/>
    <item
        android:id="@+id/icon_row_menu_id"
        android:title="@null"
        android:visible="true">
        <menu>
            <item
                android:id="@+id/item_back"
                android:icon="@drawable/ic_arrow_back_24dp"
                android:title="@string/go_back" />
            <item
                android:id="@+id/item_forward"
                android:icon="@drawable/ic_arrow_forward_24dp"
                android:title="@string/go_forward" />
            <item
                android:id="@+id/item_bookmark_page"
                android:icon="@drawable/ic_star_border_24dp"
                android:title="@string/bookmark_this_page" />
            <item
                android:id="@+id/item_download_page"
                android:icon="@drawable/ic_download_24dp"
                android:title="@string/download_page" />
            <item
                android:id="@+id/item_info"
                android:icon="@drawable/ic_info_outline_24dp"
                android:title="@string/view_site_information" />
        </menu>
    </item>
    <item
        android:id="@+id/item_new_tab"
        android:title="@string/new_tab" />
    <item
        android:id="@+id/item_new_incognito_tab"
        android:title="@string/new_incognito_tab" />
    <item
        android:id="@+id/item_bookmarks"
        android:title="@string/bookmarks" />
    <item
        android:id="@+id/item_history"
        android:title="@string/history" />
    <item
        android:id="@+id/item_downloads"
        android:title="@string/download" />
    <item
        android:id="@+id/item_settings"
        android:title="@string/settings" />
    </group>
</menu>

这是我如何使用它:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    mainMenu = menu;
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

http://www.viralandroid.com/2016/01/android-custom-horizontal-icons-menu.html - Aditya Vyas-Lakhan
但在这个例子中,他没有使用菜单文件。 - Amine Harbaoui
你尝试过使用<group>icons</group>将图标分组吗? - Alper Fırat Kaya
1
@NileshRathod 感谢您的评论,我刚刚找到了一个 AndroidChromium 的源代码 https://github.com/JackyAndroid/AndroidChromium,在这个项目中,他们像我一样使用了菜单文件,但我不知道他们如何在同一行水平显示项目。 - Amine Harbaoui
@AmineHarbaoui请回答这个问题,这样其他用户就可以使用它了。 - AskNilesh
显示剩余3条评论
2个回答

1
你可以使用app:actionLayout="@layout/layout_name"属性来设置item标签的布局,例如:
<item
android:id="@+id/menu_id"
android:title="@string/title"
 app:showAsAction="never"
app:actionLayout="@layout/layout_name"/>

而且你的 layout_name 是任何类似于布局文件的文件

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

// 在这里添加您的水平菜单项

</LineearLayout>

并且您可以访问此项

 @Override 
  public boolean onPrepareOptionsMenu(Menu menu) 
   {
    MenuItem item = menu.findItem(R.id.menu_id);
    Linearlayout rootView = (LinearLayout)item.getActionView();
    YourControlClass control = (YourControlClass) 
    rootView.findViewById(R.id.control_id); 
    return true; 
    } 

1
同样的问题,没有任何改变。 - Amine Harbaoui
你在菜单项中使用过水平布局吗? - Anil
当然,我会。 - Amine Harbaoui
修改了我的回答 - Anil
当我加入android:showAsAction时,出现了编译错误。 - Amine Harbaoui
显示剩余2条评论

0

你也可以尝试使用弹出窗口,这可能有助于检查上面的代码

popup.xml布局文件不是菜单

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              android:background="@color/cardview_light_background"
              android:layout_margin="20dp">

    <LinearLayout
        android:layout_margin="5dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        //your images with horizontal

    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_margin="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

       // your vertical list view
    </LinearLayout>
</LinearLayout>

并且您可以将以下代码添加到onClick()方法中:

LayoutInflater layoutInflater
                        = (LayoutInflater) context
                        .getSystemService(LAYOUT_INFLATER_SERVICE);

                final View popupView = layoutInflater.inflate(R.layout.popup, null);
                final PopupWindow popupWindow = new PopupWindow(
                        popupView,
                        ActionMenuView.LayoutParams.WRAP_CONTENT,
                        ActionMenuView.LayoutParams.WRAP_CONTENT, true);

                popupWindow.setOutsideTouchable(true);
                popupWindow.setFocusable(true);


                popupWindow.setBackgroundDrawable(new BitmapDrawable());

                View parent = view.getRootView();

                popupWindow.showAtLocation(parent, Gravity.TOP|Gravity.END,0,0);

1
我已经说过了,我不想要对话框或弹出窗口,我想用菜单文件来实现它。 - Amine Harbaoui
1
@AmineHarbaoui 你不能为溢出菜单项设置自定义视图,因此Chrome没有使用标准操作栏。奇怪的是,Google甚至不使用它推动其他人使用的标准工具,但这就是事实。 - AskNilesh

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