26

我有一个PopupWindow我想锚定到一个操作栏菜单项,但似乎无论如何都无法获得View我想要单击的项目。这是该PopupWindow showAsDropDown()方法所必需的。

有谁知道如何实现这一目标?

4

5 回答 5

43

您可以使用菜单项 id 获取视图,方法是在onOptionsItemSelected..

findViewById(R.id.menu_item);
于 2012-11-12T13:32:41.080 回答
39

findViewById 不必在 onOptionsItemSelected 上运行以获取操作项的视图。

但是,请注意,有时操作项会位于溢出菜单内,因此您可能会得到一个空值。

那么,你怎么能做到呢?

这是一个示例代码:

public boolean onCreateOptionsMenu(final Menu menu) {
  getSupportMenuInflater().inflate(R.menu.main, menu);
  new Handler().post(new Runnable() {
    @Override
    public void run() {
      final View menuItemView = findViewById(R.id.menu_action_item);
      ...

这是在 android 4.1.2 和 android 2.3.5 上使用 actionBarSherlock 库时测试的。

另一种选择是使用更广泛的方式,在showcaseView 库上使用,here

于 2013-08-25T09:24:37.997 回答
2

每个地方都调用:

activity.findViewById(R.id.menu_item);

如果您在片段中的代码不使用:

getView().findViewById(R.id.menu_item); 

它将返回null

于 2016-07-03T11:22:54.600 回答
1

我也遇到了这个问题, findViewById 应该在我身边工作,这里是示例代码:

private void setDrawable(final Menu menu) {
    if (menu == null || menu.size() == 0) return;

    Utils.postToUiHandler(new Runnable() {
        @Override
        public void run() {
            int size = menu.size();
            for (int i = 0; i < size; i++) {
                MenuItem menuItem = menu.getItem(i);
                if (menuItem != null) {
                    View view = activity.findViewById(menuItem.getItemId());
                    if (view != null) {
                        Drawable drawable = ThemeDrawables.get(ThemeWorker.Segment.DEFAULT).actionbarButton();
                        if (drawable != null && view.getBackground() != drawable) {
                            int sdk = android.os.Build.VERSION.SDK_INT;
                            if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
                                view.setBackgroundDrawable(drawable);
                            } else {
                                view.setBackground(drawable);
                            }
                        }

                    }
                }
            }
        }
    });

}

请注意,我在 UI 线程中创建了 findViewById,因为 menuitem 的视图没有膨胀,因此应该在 UI 线程中运行

于 2016-10-21T08:55:30.943 回答
1

只需调用findViewById(您的菜单 ID),但请记住不要调用,OnCreate(...)因为此时菜单没有膨胀,而是调用它onOptionsItemSelected

于 2019-12-29T15:28:36.953 回答