我该如何改变弹出菜单的位置?

7

我在一个列表视图适配器中有一个弹出式菜单,每个项目都有。菜单从屏幕左侧弹出,我该如何将其改为在右侧显示?

private void showPopupMenu(View v, final App app) {
    PopupMenu popupMenu = new PopupMenu(context, v);

    popupMenu.getMenuInflater().inflate(R.menu.quick_action_menu,
            popupMenu.getMenu());
    popupMenu
            .setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                    ...
5个回答

16

晚来总比不来好 =) 这是我的决定,它让你能够在指定坐标设置弹出菜单。代码不是很优秀,但它可以工作。

public void show(Activity activity, float x, float y)
{
    final ViewGroup root = (ViewGroup) activity.getWindow().getDecorView().findViewById(android.R.id.content);

    final View view = new View(context);
    view.setLayoutParams(new ViewGroup.LayoutParams(1, 1));
    view.setBackgroundColor(Color.TRANSPARENT);

    root.addView(view);

    view.setX(x);
    view.setY(y);

    PopupMenu popupMenu = new PopupMenu(context, view, Gravity.CENTER);

    popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener()
    {
        @Override
        public void onDismiss(PopupMenu menu)
        {
            root.removeView(view);
        }
    });

    popupMenu.show();
}

在绝对坐标上显示弹出窗口的完美解决方案! - alierdogan7

10
你可以通过以下属性更改 PopupMenu 的位置: gravitydropDownHorizontalOffsetdropDownVerticalOffset 首先将 gravity 设置为 Gravity.END。
popup.setGravity(Gravity.END);

然后通过创建样式来更改您的下拉偏移量

<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
    <item name="android:dropDownHorizontalOffset">-4dp</item>
    <item name="android:dropDownVerticalOffset">4dp</item>
</style>

如果您想重叠锚点视图,请使用:
parent="@style/Widget.AppCompat.PopupMenu.Overflow"

最后将MyPopupMenu应用到您的主题中。
<item name="popupMenuStyle">@style/MyPopupMenu</item>

1
popup.setGravity() 需要 API 级别 23。 - lilbiscuit
1
请确保您使用向后兼容的Android Support库,并在导入androidx.appcompat.widget.PopupMenu;之后进行操作。 - Bhavesh Rangani

2
您可以使用PopupWindow。在那里,您有许多定位选项:
  • popupWindow.showAsDropDown(View parent) 将显示在父视图下方
  • popupWindow.showAsDropDown(View anchor, int xoff, int yoff) 将显示在父视图下方,但也应用了偏移量
  • popupWindow.showAsDropDown(View anchor, int xoff, int yoff, int gravity) 与之前相同,但也有重力
  • popupWindow.showAtLocation(View parent, int gravity, int x, int y) 在任何绝对位置弹出

0

您可以使用ListPopupWindow来显示列表弹出菜单。有一些函数可以设置偏移量(ListPopupWindow)。

或者您可以使用此function来显式地设置PopupWindow的偏移量。


0

不行。文档所述

PopupMenu 在模态弹出窗口中显示菜单,该窗口锚定在视图上。如果有空间,弹出窗口将显示在锚定视图下方;如果没有,则显示在其上方。如果 IME 可见,则在触摸之前不会重叠。在弹出窗口外部触摸将使其消失。

您可以尝试使用 PopupWindow,它允许进行此类定位。


只是一个小的补充:使用PopupWindow并在showAtLocation(View parent,int gravity,int x,int y)的帮助下设置所需的位置。 - Herr K
确实,我建议使用PopupWindow的原因不是很清楚。已经进行了更新,谢谢。 - Marcin Orlowski
这是有道理的,但它与事实相矛盾,即你可以设置重力(setGravity(int)),但却没有任何效果。 - Nonos

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