使用保证金实现弹出菜单

Anc*_*tal 14 android popupmenu

我正在使用默认的弹出菜单,并期望相同的行为.一切都很好.我关注的是弹出菜单的渲染.我的弹出菜单显示在屏幕右侧.

我想要Youtube应用程序用于android的行为.在此输入图像描述

我主要无法为弹出菜单提供正确的保证金.请帮忙.我试过为PopUp菜单提供Gravity.但弹出菜单粘在屏幕右侧.

PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
Run Code Online (Sandbox Code Playgroud)

Mar*_*bey 36

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

首先将重力设置为Gravity.END

popup.setGravity(Gravity.END);
Run Code Online (Sandbox Code Playgroud)

然后通过创建样式来更改下拉列表偏移

<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
    <item name="android:dropDownHorizontalOffset">-4dp</item>
    <item name="android:dropDownVerticalOffset">4dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)

如果要重叠锚视图使用

parent="@style/Widget.AppCompat.PopupMenu.Overflow"
Run Code Online (Sandbox Code Playgroud)

最后将MyPopupMenu应用于您的主题

<item name="popupMenuStyle">@style/MyPopupMenu</item>
Run Code Online (Sandbox Code Playgroud)

  • 更新上面的注释:偏移后我纠正一个愚蠢的错误工作,毕竟:)如果你不想全局启用弹出框的形式,你可以用一个指定的样式实例吧:`新的PopupMenu(背景下,锚,重力.END,0,R.style.PopupMenuStyle)`. (4认同)
  • 谢谢,将重力设置为Gravity.END对我有用。默认的NO_GRAVITY值似乎用于忽略与其锚点的对齐。 (2认同)

Dav*_*uez 8

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

我试图做你正在做的事情,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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

关键部分是调用mPopupWindow.setHorizontalOffset(). 请注意,此方法很棘手。根据您设置的值,mPopupWindow.setWidth()您必须相应地调整值setHorizontalOffset()。碰巧的是,对于我的应用程序,这-380是我最终需要的完美保证金。所以你可能需要稍微调整一下这个值。

我相信同样可以使用可以说setHeight()setVerticalOffset(),如果你想在你的弹出窗口的顶部一定的余量。

希望这可以帮助 :]


Anu*_*rma 1

您可以在特定位置设置 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

public void showAsDropDown(View anchor, int xoff, int yoff) {
        showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
    }
Run Code Online (Sandbox Code Playgroud)

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