2015-09-10 1 views
3

Я пытаюсь получить View из Меню, которое было сгенерировано с помощью onCreateOptionMenu() и привязано к правому углу ToolBar.Получить представление, которое создается onCreateOptionMenu (ActionMenu) - ToolBar

Причина:

Я хочу, чтобы отобразить ShowCaseView, который показывает особенности моего приложения, которое связано с меню на ToolBar.

Пробовал:

  1. Установка ActionView (actionViewClass). Затем получают представление с помощью

    (View)menu.findItem(R.id.menu_search); //which returns null every time. 
    
  2. Обнаружив, что вид из деятельности - он делает вид возврата, но не в первой попытке.

    getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.action_award) 
    
  3. Я получаю ToolBar - Back Button (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> 

ToolBar - DrawerIcon

ToolBar - Event Button which is created using onCreateOptionMenu

+0

почему вы не имеете намерения и начать этот вид в рамках выбора опций меню? –

+0

В меню выбора опции меню в onOptionsItemSelected()? –

+0

@Heyyou Я использую библиотеку ShowCaseView, которая требует просмотра, чтобы показать информацию об этом представлении и что он делает. Вот почему мне нужно такое представление, которое я создал из onCreateOptionMenu(). Любое просветление по этому поводу? –

ответ

2

1. LayoutChangeListener

В качестве обходного пути, вы можете добавить это в onCreate, напоминание о том, что обратный вызов будет вызван дважды, причем первый раз не удалось найти вид, потому что меню было еще не завышен. Поэтому я включил проверку нулевого значения, которое необходимо.

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. FindView с Помощью DecorView

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

Я действительно называл это oncreateoptionmenu. Но и удачи там нет. –

+0

Лемме попробуйте эти! С помощью 'getWindow() getDecorView(). FindViewById (android.R.id.content) .findViewById (R.id.action_award)' Я действительно получаю такой же вид, как и в вашем ответе, мне нужно, чтобы он дважды звонил. –

+0

Да, я тоже это прочитал. Однако лично я не уверен в причине 'getWindow(). GetDecorView(). FindViewById (android.R.id.content) .findViewById (R.id.action_award) ', но это' onLayoutChangeListener' –

Смежные вопросы