从操作栏菜单项获取视图

28

我有一个 PopupWindow,希望将其锚定到操作栏菜单项,但似乎找不到要点击的菜单项的View。 这是使用 PopupWindowshowAsDropDown() 方法所必需的。

有人知道如何实现吗?


尝试这个 https://dev59.com/h2oy5IYBdhLWcg3wWso_#62533513 - Shahbaz Hashmi
5个回答

45

通过在onOptionsItemSelected中获取菜单项ID,可以获取视图..

findViewById(R.id.menu_item);

2
不,这行不通。我先尝试了那个方法,但它只返回一个空指针。但是我也不指望它能成功,因为操作栏上的项是一个 MenuItem,似乎并不是一个 View。所以我正在尝试获取该 MenuItem 内部的 View。 - Kyros
取决于您在哪里调用它,您应该在活动内调用它以获取视图,然后将其传递给弹出窗口。这对我有效。 - Nermeen
我试图在OnCreate中找到视图,你是在哪里调用它的? - Kyros
4
如果按照你所建议的,在“onOptionsItemSelected”中找到了视图,它会很好地运作。谢谢! - Kyros
2
findViewById不必在onOptionsItemSelected上运行,以获取操作项的视图。我已经为此添加了一个新答案。 - android developer
显示剩余4条评论

39

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

但请注意,有时操作项会在溢出菜单中,因此可能会返回空值。

那么,你该怎么做呢?

以下是示例代码:

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);
      ...

这是在使用actionBarSherlock库时进行测试的,测试环境为android 4.1.2和android 2.3.5。

另一种选择是使用更全面的方法,它在showcaseView库中被使用,这里


你知道没有使用任何第三方库的好方法吗? - Epiglottal Axolotl
是的,不使用actionBarSherlock也可以。我只是提到它是我测试过的东西。这个库在Android版本为3.0及以上时显示普通的本地操作栏。 - android developer
8
通过使用这个,我也得到了空视图。 - ingsaurabh
@mr.boyfox,请问您能否在其他设备/模拟器上进行检查?也许他在某些情况下发现了问题。 - android developer
在Android 5.1上返回null。 - Sakiboy
显示剩余5条评论

2
我也遇到了这个问题,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线程中运行。

2

随时随地通话:

activity.findViewById(R.id.menu_item);

如果您的片段内的代码没有使用:

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

它将返回 null

1

只需调用findViewById(你的菜单id),但记住不要在OnCreate(...)中调用,因为此时菜单还没有被填充,而是在onOptionsItemSelected中调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接