从操作栏菜单项中获取视图

时间:2012-11-12 13:30:54

标签: android

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

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

5 个答案:

答案 0 :(得分:40)

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

中获取
findViewById(R.id.menu_item);

答案 1 :(得分:33)

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

然而,请注意有时候动作项会出现在溢出菜单中,所以你可能会得到一个null。

所以,你怎么能这样做?

这是一个示例代码:

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 libraryhere上使用。

答案 2 :(得分: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线程中运行

答案 3 :(得分:0)

只需致电findViewById(您的菜单ID) 但请记住不要调用oncreate,因为此时菜单并没有膨胀,但是 用onOptionsItemSelected

称呼它

答案 4 :(得分:-1)

致电的地方:

activity.findViewById(R.id.menu_item);

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

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

它将返回 null