弹出菜单显示在屏幕的左下方

Popup Menu shows at left bottom of the screen

之前有人问过这个问题。我按照答案中的步骤操作,但是没有用。

我在片段中有一个按钮。单击该按钮时,我想显示一个弹出菜单。我尝试了很多方法,但弹出菜单一直显示在屏幕的左下方。

这是弹出菜单的方法:

    public void showPopup(View v) {
    //added library level 25
    //may conflict with later updates
    PopupMenu popup = new PopupMenu(getContext(), v, Gravity.END);
    popup.setGravity(Gravity.END);
    MenuInflater menuInflater = popup.getMenuInflater();
    menuInflater.inflate(R.menu.menu_home_fragment, popup.getMenu());

    //handling items of the popup menu:
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            int id = item.getItemId();

            //no inspection Simplifiable If Statement
            if (id == R.id.menu_about_app) {
                //startActivity(new Intent(MainActivity.this, AboutDietCornerActivity.class));
            }
            if (id == R.id.menu_rate_app) {
                Intent i = new Intent(android.content.Intent.ACTION_VIEW);
                i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.techdroidltd.dietcorner"));
                startActivity(i);
            }
            if (id == R.id.menu_user_ideas) {
                //startActivity(new Intent(MainActivity.this, UserIdeasActivity.class));
            }
            if (id == R.id.menu_privacy_policy) {
                //startActivity(new Intent(MainActivity.this, PrivacyPolicyActivity.class));
            }
            return false;
        }
    });
    //end of handling items .. then show popup:
    popup.show();
}

然后我在片段的 onCreateView 中创建了一个按钮来调用该方法:

mainMenuButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showPopup(getView());
        }
    });

弹出菜单显示且运行良好。它显示在错误位置的问题,无论我如何改变它的引力。请帮助。

仅参考文档,弹出菜单视图始终锚定到视图,它会弹出/出现在锚定视图的下方或上方。如文档中所述,

A PopupMenu displays a Menu in a modal popup window anchored to a View. The popup will appear below the anchor view if there is room, or above it if there is not. If the IME is visible the popup will not overlap it until it is touched. Touching outside of the popup will dismiss it.

PopupMenu

所以,在你的情况下,我已经测试过它锚定到由 getView() 创建的视图实例;我相信您的 PopupMenu 已锚定到 mainMenuButton 的实例视图,或由 getView();

创建的任何内容

因为您正在使用以下构造函数创建弹出菜单的实例 PopupMenu(Context context, View anchor, int gravity),所以这意味着您将弹出菜单锚定到某个视图,弹出菜单将出现在该视图的上方或下方。

setGravity(int gravity)

设置用于将弹出窗口 window 与其锚点视图对齐的引力。

这只是为了让你了解实际发生的事情。因此,简单的解决方案是将锚视图放在弹出视图将出现的位置,然后修改相对于锚点的对齐方式,以修改相对于锚点视图的位置。