OnNavigationItemВыбран в ActionBar вызывается при запуске, как его избежать?

Я использую ActionBar с выпадающим меню, и onNavigationItemSelected() вызывается, как только создается действие, поэтому вызывается первый элемент. Первым пунктом моего выпадающего меню является "Домой", тем же действием, что и нажатие значка приложения с помощью 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 во всех моих действиях, поэтому каждый раз, когда начинается каждое действие, он называет себя навсегда, поэтому я должен поместить этот код для каждого действия. Что происходит? Как я могу предотвратить это?

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

и в ListView onCreate():

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

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

Ответ 4

Прежде всего благодаря @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. Если кто-то может пролить свет на это, это будет полезно.