2014-10-01 3 views
2

Я использую ShowcaseView так:ShowcaseView выдвигает на первый план не тот товар

ActionItemTarget target = new ActionItemTarget(this, R.id.menu_search); 

ShowcaseView sv = new ShowcaseView.Builder(this, true) 
       .setTarget(target) 
       .setContentText("Press this to search") 
       .setStyle(R.style.CustomShowcaseTheme) 
       .build(); 

Но когда я начинаю приложение первый, ShowcaseView выделяет кнопку домой. Когда я снова попытаюсь запустить приложение, вы увидите пример ActionBar. Мое приложение не использует библиотеки совместимости, такие как ActionbarSherlock.

Любая идея, почему это может произойти?

+0

Что вы подразумеваете под «началом приложения снова». Вы принудительно закрываете его и открываете, или вы снова открываете его, вызывая onPause + onResume? Также когда вы вызываете этот код? Потому что 'R.id.menu_search' может быть недоступен в то время –

+0

@PedroOliveira Я вызывал его в onCreate(). Очевидно, что это неправильное место. –

+0

Лучшее место для использования этого кода будет на onCreateOptionsMenu, и даже там 'R.id.menu_search' не указывает на представление, потому что оно еще не завышено, поэтому вам нужно будет найти способ сделать это там, не используя id. –

ответ

3

В соответствии с просьбой:

Проблема заключается в том, что вы пытаетесь получить идентификатор для вида, который не в иерархии еще. В соответствии с циклом просмотра активности меню создается только после onCreate. Лучшим решением является использование onCreateOptionsMenu, но даже здесь R.id.menu_search не вернет действительный идентификатор, потому что меню еще не создано. Поскольку порядок событий изменился в API lvl 16, я предлагаю вам немного взломать его. Вы можете создать обработчик на вашем onCreate() и выполнить postDelayed runable. Код будет выполнен после того, как меню было разработано. На этом плавающем режиме вы можете получить представление для R.id.menu_search и выделить его.

0

Я попытаюсь представить примеры кода здесь:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 

    new ShowcaseView.Builder(this) 
      .withMaterialShowcase() 
      .setTarget(new ToolbarActionItemTarget(this.toolbar, R.id.menu_search)) 
      .setContentText("Here's how to highlight items on a toolbar") 
      .build() 
      .show(); 

    return true; 
} 

Примечание: панель объявить как член класса.