从 属性 "showAsAction" 从来没有的 MenuItem 获取视图

Get view from MenuItem which property "showAsAction" never

我用这个 library 来展示导游。我想将 Spotlight 实现到 Menu Item 中,其中 属性 showAsAction 从未有过。在我的代码片段下面:

View view = getActivity().findViewById(R.id.menu_item_refresh);
        new SpotlightView.Builder(getActivity())
                .introAnimationDuration(400)
                .enableRevealAnimation(true)
                .performClick(true)
                .fadeinTextDuration(400)
                .headingTvColor(Color.parseColor("#eb273f"))
                .headingTvSize(32)
                .headingTvText("")
                .subHeadingTvColor(Color.parseColor("#ffffff"))
                .subHeadingTvSize(16)
                .subHeadingTvText("Tap on chart to show detail")
                .maskColor(Color.parseColor("#dc000000"))
                .target(view)
                .lineAnimDuration(400)
                .lineAndArcColor(Color.parseColor("#eb273f"))
                .dismissOnTouch(true)
                .dismissOnBackPress(true)
                .enableDismissAfterShown(true)
                .usageId("")
                .show();

我收到此错误:

FATAL EXCEPTION: main
                 Process: x.com.d, PID: 15058
                 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getLocationInWindow(int[])' on a null object reference
                 at com.wooplr.spotlight.target.ViewTarget.getPoint(ViewTarget.java:23)
                 at com.wooplr.spotlight.shape.Circle.getFocusPoint(Circle.java:36)
                 at com.wooplr.spotlight.shape.Circle.<init>(Circle.java:24)
                 at com.wooplr.spotlight.SpotlightView$Builder.build(SpotlightView.java:1082)
                 at com.wooplr.spotlight.SpotlightView$Builder.show(SpotlightView.java:1091)

我看到发生错误是因为 Menu Item 在主视图中不可见。我阅读了 this 相关问题,但我仍然遇到同样的错误。是否有可能得到那个不可见的项目(永远不会作为行动)?

您需要override以下内容method才能访问MenuItem View

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem menuItem = menu.findItem(R.id.the_one_to_spotlight);
    View view = MenuItemCompat.getActionView(menuItem);

   // Now do whatever you want with the View

    return super.onPrepareOptionsMenu(menu);
}

我假设 .target(view) 在这种情况下可以解决问题。

如果仍然不能满足您的 View,我会考虑更换您的 showAsAction。在此处阅读有关此的更多有用信息:

我在 reference 上找到了解决方案。 JarredRummler 的回答将 OverflowbMenuButton 作为 ImageView。使用该方法并将 OverflowMenuButton 转换为 View 并使用它。