为选项菜单子项添加右边距

Add right margin to the options menu sub-items

目前,我的选项菜单与屏幕末尾对齐。我想给它一个边距,比如 android:layout_marginEnd = "20dp"。我怎样才能做到这一点?

我的选项菜单:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/menu_items"
        android:icon="@drawable/menu_icon"
        app:showAsAction="always">

        <menu>
            <group android:id="@+id/item1">
                <item
                    android:id="@+id/download"
                    android:icon="@drawable/download_icon"
                    android:title="Download"></item>
            </group>

            <group android:id="@+id/item2">
                <item
                    android:id="@+id/invite"
                    android:icon="@drawable/invite_icon"
                    android:title="Invite"></item>
            </group>    
        </menu>    
    </item> 
</menu>

我的自定义工具栏:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/menu_toolbar"
    app:popupTheme="@style/ThemeOverlay.MyTheme"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_below="@id/greetText">     <!--assume it comes somewhere in the centre due to this-->

</androidx.appcompat.widget.Toolbar>

我的菜单项主题:

<style name="ThemeOverlay.MyTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:textColor">@color/dimGray</item>
    <item name="android:textSize">14sp</item>
    <item name="android:layout_marginEnd">20dp</item> <!-- doesn't work-->
    <item name="android:fontFamily">@font/quicksand_medium</item>
    <item name="android:background">@drawable/options_menu_background</item>
</style>

这是我的问题的图片。它显示了菜单的末端和屏幕是如何对齐的。我想要这两者之间的 space/margin。

这是一个有趣的问题。我尝试了很多在互联网上找到的东西,但没有任何效果。我尝试将 actionOverflowMenuStyle 设置为 dropDownHorizontalOffset 属性,但这也不起作用。最后,我得到了一个 PopupMenu ,效果很好。这是实现。

使用单个项目缩短您的初始菜单,该项目将作为子菜单打开弹出菜单。

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

    <item
        android:id="@+id/menu_items"
        android:icon="@drawable/ic_close_swipe"
        android:title="@string/app_name"
        app:showAsAction="always" />
</menu>

然后在您的 /res/menu/ 文件夹中创建另一个菜单,命名为 popup_menu.xml,如下所示。

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

    <item
        android:id="@+id/menu_items"
        android:icon="@drawable/ic_close_swipe"
        android:title="@string/app_name"
        app:showAsAction="always" />
</menu>

现在在你的MainActivity中,只需添加以下函数来处理菜单按钮和弹出菜单的点击动作。

public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar myToolbar = findViewById(R.id.menu_toolbar);
        setSupportActionBar(myToolbar);
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.menu_items:
                showPopupMenu();
                return true;
            default:
                return false;
        }
    }

    public void showPopupMenu() {
        PopupMenu popup = new PopupMenu(this, findViewById(R.id.menu_items));
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.popup_menu);
        popup.setGravity(Gravity.END);

        Object menuHelper;
        Class[] argTypes;
        try {
            Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
            fMenuHelper.setAccessible(true);
            menuHelper = fMenuHelper.get(popup);
            argTypes = new Class[]{boolean.class};
            menuHelper.getClass().getDeclaredMethod("setForceShowIcon", argTypes).invoke(menuHelper, true);
        } catch (Exception e) {
            e.printStackTrace();
        }

        popup.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.invite:
                Toast.makeText(this, "Invite", Toast.LENGTH_LONG).show();
                return true;
            case R.id.download:
                Toast.makeText(this, "Download", Toast.LENGTH_LONG).show();
                return true;
            default:
                return false;
        }
    }
}

我把工作代码放在这个Github Branch。您可能会考虑从该分支和 运行 应用程序进行克隆,以检查这是否满足您的期望。

希望对您有所帮助!