2012-04-15 2 views
10

Я использую ActionBar с выпадающим меню, и onNavigationItemSelected() вызывается, как только создается действие, поэтому вызывается первый элемент. Первым пунктом моего выпадающего меню является Home, то же действие, что и нажатие значка приложения с android.R.id.home, поэтому при запуске приложения он вызывает себя. Чтобы избежать этого случая у меня есть этот код:onNavigationItemВыбран в ActionBar вызывается при запуске, как его избежать?

if(this.getClass() != FrecView.class){ //if i am not currently on the Activity 
    Intent frec = new Intent(this, FrecView.class); 
    frec.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(frec); 
} 

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

ответ

4

Я использую ActionBar йота выпадающее меню и onNavigationItemSelected() вызывается, как только активность создается

Это не предназначен, чтобы быть «меню», больше, чем вкладки предназначены для меню". Навигация по списку предназначен для того, чтобы пользователь мог указать некоторый контент для текущей деятельности, как правило, путем замены фрагмента. Элементы действий (например, кнопки панели инструментов, область распространения действия) предназначены для навигации между действиями.

Первый элемент моего выпадающего меню - это то же действие, что и при нажатии на значок приложения whit android.R.id.home, поэтому при запуске приложения он вызывает сам.

Итак, удалите это из своего «меню». Пользователь может нажать значок своего приложения слева, чтобы перейти домой.

+0

Но если вы не разместите дом там, он будет называть один из моих занятий, вы говорите, что он не предназначен для вызова мероприятий, поэтому мне нужно будет поместить все на значки ActionBar? – Andres

+0

@ Andres: «Но если вы не вернетесь туда, это вызовет одно из моих действий» - нет, * вы * будете «называть одну из [ваших] действий». У 'Spinner' всегда есть выбор, независимо от того, какой вы выбрали или по первой записи по умолчанию. Если вы решите начать работу над этим первым выбором, это ваша собственная ошибка, потому что вы тот, кто написал этот код. – CommonsWare

+0

«это твоя собственная ошибка» ... Может быть, это не предназначено для того, чтобы быть меню, но оно выглядит и выглядит точно так же, как одно. Есть возможность для этой ошибки. Кроме того, несколько ресурсов, включая SO, предлагают этот подход неправильно: http://stackoverflow.com/questions/13958912/how-to-implement-a-drop-down-navigation-action-bar-in-android-after-youve-added – Alex

5

Как указал Марк, его не предназначено для того, чтобы быть меню.

Однако, вот быстрый и грязный подход игнорировать первый вызов:

объявляет поле класса:

//mNaviFirstHit should be initialized to true 
private boolean mNaviFirstHit = true; 

И в onNavigationItemSelected:

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    if (mNaviFirstHit) { 
     mNaviFirstHit = false; 
     return true; 
    } 
    // DO WHAT YOU WOULD NORMALLY DO 
} 
+0

private boolean mNaviFirstHit = false; Не 0. – Radu

+0

ПРАВИЛЬНОЕ РЕШЕНИЕ: (Я тоже редактировал содержимое) mNaviFirstHit должен быть инициализирован true, а не 0 не false; –

0

Прежде всего благодаря @CommonsWare, чтобы напомнить нам, что это альтернатива вкладкам, поэтому код должен быть разработан с этой точки зрения. Хотя это не так прямо, как кажется, тем не менее мы можем работать там.

Этого можно избежать, используя флаг. Но, в любом случае, я предлагаю подход, который я принял, чтобы исправить это.

Просто убедитесь, что это называется один раз. Кроме того, сделать его внутренним классом, чем анонимным. Это предотвратит его вызывается каждый раз, когда выполняется эта часть кода. код ниже:

if(localOnNavigationListener != null) 
    localOnNavigationListener = new LocalOnNavigationListener(); 

class LocalOnNavigationListener implements OnNavigationListener{ 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    // do something 
    return true; 
    } 

} 

И я вижу странное событие здесь, если я сделать его внутренний класс не называют onNavigationItemSelected(), если мы делаем это анонимный класс, он будет срабатывать onNavigationItemSelected метод. Если кто-то может пролить свет на это, это будет полезно.

3

Вы можете заставить правильный вариант по умолчанию в вашем «меню» со следующим:

bar.setListNavigationCallbacks(mNavigationAdapter, this); 
bar.setSelectedNavigationItem(indexOfCurrentActivityInTheMenu); 

Counter-интуитивно это должно быть сделано после установки обратных вызовов (что на мой взгляд, даст CallBack шанс огонь с индексом навигации 0). Например, мое приложение имеет два вида деятельности ListView и PageView, и мне нравится, что мое меню навигации упорядочено по алфавиту, но начальная активность по умолчанию - это PageView. Таким образом, у меня есть следующие в OnCreate с просмотрами страниц, в():

bar.setListNavigationCallbacks(mNavigationAdapter, this); 
bar.setSelectedNavigationItem(1); 

и в OnCreate ListView (в): не

bar.setListNavigationCallbacks(mNavigationAdapter, this); 
bar.setSelectedNavigationItem(0); 

Тогда, независимо от того, сколько раз я называю startActivity (Отервью), он всегда будет установлен меню навигации правильно.

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