获取由 onCreateOptionsMenu(Action Menu) - ToolBar 创建的视图

Get view which is created by onCreateOptionMenu(ActionMenu) - ToolBar

我正在尝试从菜单中获取 View,该菜单是在 onCreateOptionMenu() 的帮助下生成的,并绑定在 ToolBar 的右上角。

原因:

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

尝试过:

  1. 正在设置 ActionView(actionViewClass)。然后在

    的帮助下查看
    (View)menu.findItem(R.id.menu_search); //which returns null every time.
    
  2. 从 Activity 中找到该视图 - 它确实 return 视图但不是第一次尝试。

    getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.action_award)
    
  3. 我在

    的帮助下获得了工具栏 - 后退按钮 (ImageButton) 视图
     mToolBar.getChildAt(0);
    

这是我的 menu_mother :

<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 中添加此内容,请注意回调将被调用两次,第一次无法找到视图,因为菜单尚未展开。因此,我包含了对 not null 的检查,这是必需的。

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