android - 为选项菜单子(monad)项添加右边距

标签 android android-layout android-toolbar android-menu

目前,我的选项菜单与屏幕的末尾对齐。我想给它一个边距,比如 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>

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

enter image description here

最佳答案

这是一个有趣的问题。我尝试了很多在互联网上找到的东西,但没有任何效果。我尝试使用 dropDownHorizo​​ntalOffset 属性设置 actionOverflowMenuStyle,但这也不起作用。最后,我得到了一个工作正常的 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 中.您可能会考虑从该分支克隆并运行应用程序以检查这是否满足您的期望。

希望对您有所帮助!

关于android - 为选项菜单子(monad)项添加右边距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57379774/

相关文章:

android - 更改 TextInputEditText 中底线的空格

java - 如何在 Android 中检索雅虎联系人?

android - 不同设备的自定义 View 大小

android - 如何在 android 的 tablelayout 中为 tablerow 设置边框?

android - 如何在Android中居中&左&右对齐ActionBar图标

android - 如何在工具栏上绘制带有抽屉导航和自定义图标的 Material 滑动标签?

android - 如何为 320dp 和 360dp 创建布局?

java - CardView动画

java - 如何使您的自定义 View 可聚焦?

android - 工具栏 - 左重力未找到抽屉 View