onNavigationItemSelected в ActionBar вызывается при запуске как этого избежать?

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

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 () вызывается, как только создается Activity

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

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

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


Как Марк заявил, что он не предназначен для меню.

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

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

//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
}

вы можете заставить правильную опцию по умолчанию в вашем "меню" со следующим:

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

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

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

и в onCreate () ListView:

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

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


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

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

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

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

class LocalOnNavigationListener implements OnNavigationListener{

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

}

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