使用保证金实现弹出菜单

时间:2015-12-24 07:53:26

标签: android popupmenu

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

我想要Youtube app for android。enter image description here

使用的行为

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

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

5 个答案:

答案 0 :(得分:33)

您可以使用以下属性更改PopupMenu的位置: 重力 dropDownHorizo​​ntalOffset dropDownVerticalOffset

首先将重力设置为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 :(得分: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()

希望这会有所帮助:]

答案 2 :(得分:1)

您可以在特定位置设置popUpWindow

SELECT Actor.Actor_id AS A,(MAX(Movie.M_year))-(MIN(Movie.M_year))AS DIFF, 
       Actor.someCol1, Actor.someCol2
FROM Actor INNER JOIN Acted_in ON Actor.Actor_id=Acted_in.Actor_id
INNER JOIN Movie ON Acted_in.Movie_id=Movie.Movie_id
GROUP BY Actor.Actor_id, Actor.someCol1, Actor.someCol2

如果您想将其显示为DropDown,则可以尝试

popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0);

public void showAtLocation(View parent, int gravity, int x, int y) {
        showAtLocation(parent.getWindowToken(), gravity, x, y);
    }

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

答案 3 :(得分:0)

  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>

答案 4 :(得分:-1)

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