Android 获取由onCreateOptionMenu(操作菜单)-工具栏创建的视图

Android 获取由onCreateOptionMenu(操作菜单)-工具栏创建的视图,android,android-toolbar,android-menu,Android,Android Toolbar,Android Menu,我试图从菜单中获取视图,该菜单是在onCreateOptionMenu()的帮助下生成的,并绑定到工具栏的右角 原因: 我想显示ShowCaseView,其中显示了与工具栏上的菜单关联的应用程序的功能 尝试: 设置ActionView(actionViewClass)。然后借助于 (View)menu.findItem(R.id.menu_search); //which returns null every time. 从活动中查找该视图-它确实返回视图,但不是第一次尝试 getWindo

我试图从菜单中获取
视图
,该菜单是在
onCreateOptionMenu()
的帮助下生成的,并绑定到
工具栏的右角

原因:

我想显示
ShowCaseView
,其中显示了与工具栏上的菜单关联的应用程序的功能

尝试:

  • 设置ActionView(actionViewClass)。然后借助于

    (View)menu.findItem(R.id.menu_search); //which returns null every time.
    
  • 从活动中查找该视图-它确实返回视图,但不是第一次尝试

    getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.action_award)
    
  • 我确实得到了工具栏后退按钮(ImageButton)视图的帮助

     mToolBar.getChildAt(0);
    
  • 这是我的菜单,妈妈:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.mobcast.MotherActivity" >
    
        <item
            android:id="@+id/action_search"
            android:icon="@drawable/ic_nav_search"
            android:orderInCategory="100"
            android:title="@string/action_search"
            app:showAsAction="always"
            android:visible="true"
            tools:ignore="AlwaysShowAction"/>
        <item
            android:id="@+id/action_birthday"
            android:icon="@drawable/ic_toolbar_birthday"
            android:orderInCategory="100"
            android:title="@string/action_birthday"
            android:visible="true"
            app:showAsAction="always"/>
        <item
            android:id="@+id/action_award"
            android:icon="@drawable/ic_toolbar_award"
            android:orderInCategory="100"
            android:title="@string/action_award"
            app:showAsAction="always"/>
        <item
            android:id="@+id/action_event"
            android:icon="@drawable/ic_toolbar_search"
            android:orderInCategory="100"
            android:title="@string/action_event"
            app:showAsAction="always"/>
        <item
            android:id="@+id/action_refresh"
            android:icon="@drawable/ic_toolbar_search"
            android:orderInCategory="100"
            android:title="@string/action_refresh"
            android:visible="false"
            app:showAsAction="never"/>
        <item
            android:id="@+id/action_report"
            android:icon="@drawable/ic_toolbar_search"
            android:orderInCategory="100"
            android:title="@string/action_report"
            app:showAsAction="never"/>
    
    </menu>
    
    
    


    1。LayoutChangeListener

    作为一种解决方法,您可以在
    onCreate
    中添加此选项,提醒您回调将被调用两次,第一次无法找到视图,因为菜单尚未膨胀。因此,我包含了一个NOTNULL检查,这是必需的

    final View.OnLayoutChangeListener onLayoutChangeListener = new View.OnLayoutChangeListener() {
      @Override
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
                                 int oldTop, int oldRight, int oldBottom) {
        mMenuSearchView = v.findViewById(R.id.menu_search);
        if (mMenuSearchView != null) {
          //do whatever you want with the view
          mToolbar.removeOnLayoutChangeListener(this);
        }
      }
    };
    mToolbar.addOnLayoutChangeListener(onLayoutChangeListener);
    
    2。在DecorView的帮助下查找视图

     new Handler().postDelayed(new Runnable(){
             View mMenuAwardView = getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.action_award)
     },2000);
    

    在菜单内选项选择意味着在OnOptions ItemSelected()中?@Heyyou我使用的是ShowCaseView库,它要求视图显示有关该视图及其功能的信息。这就是为什么我需要从onCreateOptionMenu()创建的视图。有什么启示吗?@Heyyou我只是第一次展示这些showcaseview。我不想触发OnOptions ItemSelected。Moreever OnOptions ItemSelected还返回MenuItem。所以在那里也没有运气:/I我确实在oncreateoptionmenu上调用了它。但是那里也不走运。让我试试这个!在
    getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.action_award)
    的帮助下,我确实获得了与您的答案相同的视图,我需要它调用两次。是的,我也读过。然而,就我个人而言,我不太确定
    getWindow().getDecorView().findViewById(android.R.id.content)和findViewById(R.id)背后的原因‌​.行动奖)
    但此
    仅限于ChangeListener