当PopupMenu打开(但不是向下)

时间:2017-05-05 07:35:46

标签: android popupmenu

我在Activity布局中的视图上设置了一个长按监听器(它是一个显示颜色样本的视图)。长按一次将弹出一个有许多选项的PopupMenu。

它工作正常除了我发现当我长时间点击它时锚点视图朝向屏幕底部,因此弹出菜单将从它向上打开,锚视图不会保持在它只是跳到屏幕中间。菜单打开并正常运行,这只是我想要避免的跳跃。

奇怪的是,当锚点视图朝向屏幕顶部并且弹出菜单向下打开时,它不会发生...锚点视图保持原样。

以下是长按之前的示例...弹出菜单的锚点视图是靠近屏幕底部的绿色色板:

enter image description here

以下是菜单弹出后我立即看到的内容......绿色色板已经跳到屏幕中间:

enter image description here

以下是相关代码:

popup_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/colourCopy"
        android:title="@string/menu_colourCopy"/>

    <item
        android:id="@+id/colourCopySingle"
        android:title="@string/menu_colourCopySingle"/>

    <item
        android:id="@+id/colourCopyMultiple"
        android:title="@string/menu_colourCopyMultiple"/>

    <item
        android:id="@+id/colourEndMultiple"
        android:title="@string/menu_colourEndMultiple"/>

    <item
        android:id="@+id/colourPaste"
        android:title="@string/menu_colourPaste"/>

    <item
        android:id="@+id/colourReset"
        android:title="@string/menu_colourReset"/>

</menu>

MyActivity.java:

import android.support.v7.widget.PopupMenu;


View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
    public boolean onLongClick(final View v) {

        PopupMenu popup = new PopupMenu(MyActivity.this, v);
        popup.getMenuInflater()
                .inflate(R.menu.popup_menu, popup.getMenu());

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                switch( item.getItemId() ) {
                    case R.id.colourCopy:
                        Log.d(TAG, "Menu colourCopy clicked");
                        break;
                    case R.id.colourCopySingle:
                        Log.d(TAG, "Menu colourCopySingle clicked");
                        break;
                    case R.id.colourCopyMultiple:
                        Log.d(TAG, "Menu colourCopyMultiple clicked");
                        break;
                    case R.id.colourPaste:
                        Log.d(TAG, "Menu colourPaste clicked");
                        break;
                    case R.id.colourEndMultiple:
                        Log.d(TAG, "Menu colourEndMultiple clicked");
                        break;
                    case R.id.colourReset:
                        Log.d(TAG, "Menu colourReset clicked");
                        break;
                    default:
                }
                return true;
            }
        });

        popup.show();

        return true;
    }
};


View colorView = view.findViewById(setting.viewId);
colorView.setOnLongClickListener(longClickListener);

1 个答案:

答案 0 :(得分:1)

不是一个答案,而是一个解决方法......

根据我的原始帖子,我从v7支持库获得了PopupMenu

import android.support.v7.widget.PopupMenu;

但是如果我从标准库中得到它,那么它似乎都没有报告的故障:

import android.widget.PopupMenu;