【问题标题】:Implement pop up Menu with margin实现带有边距的弹出菜单
【发布时间】:2021-07-17 19:51:58
【问题描述】:

我正在使用默认的弹出菜单并期待相同的行为。一切正常。我关心的是弹出菜单的渲染。我的弹出菜单粘在屏幕右侧。

我想要 Youtube 应用程序用于 android 的行为。

我主要无法为弹出菜单提供右边距。请帮忙。 我尝试为弹出菜单提供重力。但是弹出菜单粘在屏幕右侧。

PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());

【问题讨论】:

  • 基本上,它不是粘在屏幕的右边,而是粘在你在构造函数中设置为锚的锚视图上。我不知道 Youtube 如何呈现 PopupMenus,但您可以尝试使用不同的锚点,即设置一个不可见的视图只是为了将您的 PopupMenu 附加到它。
  • 我也试过了。但它仍然坚持向右。我已尝试创建假锚视图,但行为仍然相同。
  • 哦,你是对的,我只是自己确认了。不确定 YouTube 是否这样做,但我建议尝试使用 PopupWindow 而不是 PopupMenuPopupWindow 更好地锚定在视图上,但你必须自己布置它

标签: android popupmenu


【解决方案1】:

您可以使用以下属性更改 PopupMenu 的位置: gravitydropDownHorizo​​ntalOffsetdropDownVerticalOffset

首先将重力设置为 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>

【讨论】:

  • 谢谢,将重力设置为 Gravity。END 为我解决了问题。默认的 NO_GRAVITY 值似乎是为了忽略与其锚点的对齐。
  • 适用于部分。 1. 在我的主题中,我必须添加&lt;item name="android:popupMenuStyle"&gt;...,没有android: 命名空间它没有应用菜单样式。 2. 应用了父样式,但是偏移修正没有任何效果。
  • 更新上述评论:在我纠正了一个愚蠢的错误之后,偏移量仍然有效:) 如果您不想全局启用弹出样式,您可以使用指定的样式对其进行实例化:@ 987654327@.
  • @quezak 这样的设置样式new PopupMenu(context, anchor, Gravity.END, 0, R.style.PopupMenuStyle) 不起作用
  • @syed-arsalan-kazmi 我在 5 年前评论说,我很确定它现在已经过时了 :) 从那时起我就不再使用 Android,所以我不能再帮忙了。
【解决方案2】:

这有点晚了,但我希望这对某人有所帮助。

我试图用PopupMenu 做你正在做的事情,但在我了解ListPopupWindow 之前,没有什么对我有用。这是一个更好的选择。在我看来更加灵活,您可以实现您所询问的边距。

代码如下:

public class MainActivity extends AppCompatActivity
{
    private ImageButton mMoreOptionsButton;
    private ArrayAdapter<String> mPopupAdapter;
    private ArrayList<String> mOptionsArray = 
            new ArrayList<>(Arrays.asList("Option1", "Option2", "Option3"));
    private ListPopupWindow mPopupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMoreOptionsButton = (ImageButton) view.findViewById(R.id.more_options_button);
        setupPopupWindow();
    }

    private void setupPopupWindow()
    {
        mPopupAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, mOptionsArray);
        mPopupWindow = new ListPopupWindow(MainActivity.this);
        mPopupWindow.setAdapter(mPopupAdapter);
        mPopupWindow.setAnchorView(mMoreOptionsButton);
        mPopupWindow.setWidth(500);
        mPopupWindow.setHorizontalOffset(-380); //<--this provides the margin you need
        //if you need a custom background color for the popup window, use this line:
        mPopupWindow.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.gray)));

        mPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                //do something with item by referring to it using the "position" parameter
            }
        });

        mMoreOptionsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                mPopupWindow.show();
            }
        });
    }
}

关键部分是调用mPopupWindow.setHorizontalOffset()。请注意,这种方法很棘手。根据您在mPopupWindow.setWidth() 中设置的值,您必须相应地调整setHorizontalOffset() 中的值。碰巧对于我的应用程序,-380 是我从一开始就需要的完美余量。所以你可能不得不稍微调整一下这个值。

如果您想在弹出窗口的顶部留出一些边距,我相信使用 setHeight()setVerticalOffset() 也可以这样说。

希望这会有所帮助:]

【讨论】:

    【解决方案3】:

    您可以在特定位置设置popUpWindow

    popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0);
    
    public void showAtLocation(View parent, int gravity, int x, int y) {
            showAtLocation(parent.getWindowToken(), gravity, x, y);
        }
    

    如果你想显示为 DropDown 那么你可以试试

    public void showAsDropDown(View anchor, int xoff, int yoff) {
            showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
        }
    

    查看 PopupWindow 的文档 http://developer.android.com/intl/es/reference/android/widget/PopupWindow.html

    【讨论】:

      【解决方案4】:
        PopupMenu popup = null;
              if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
                  popup = new PopupMenu(context, anchorView, Gravity.END, 0, R.style.MyPopupMenu);
              }else{
                  popup = new PopupMenu(context, anchorView);
              }
      

      风格

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

      【讨论】:

        【解决方案5】:

        只需像这样声明您的弹出菜单 var popup = PopupMenu(this.requireContext(), isw_settings_icon, Gravity.END, 0, R.style.yourmenustyle)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-18
          • 2017-05-23
          相关资源
          最近更新 更多