Когда пользователь выбирает элемент в навигационном ящике, мое приложение запускает обработчик, который, дождавшись закрытия ящика, вызывает код для замены фрагмента в моем основном действии. Однако, если устройство было повернуто во время задержки, я получаю исключение IllegalStateException.
Я прочитал эту блестящую статью о транзакциях и жизненных циклах фрагментов, но я не уверен, как справиться с этим в моем коде. Я понимаю, что не должен пытаться совершить транзакцию после onSaveInstanceState()
. Но как я узнаю, был ли вызван onSaveInstanceState()
? Я хочу сделать что-то вроде этого.
navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
// close drawers
drawerLayout.closeDrawers();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
goTo(menuItem); // swap in Fragment specified by menuItem
}
}, 300);
return true;
}
});
...
private void goTo(menuItem) {
if( alreadyCalledOnSaveInstanceState() { // THIS
return;
}
switch (item.getItemId()) {
case R.id.item1:
frag = new Fragment_Grade_Calculator();
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_up, R.anim.zoom_exit).replace(R.id.main_frag_container, frag)
.commit();
return true;
}
Но я не знаю эквивалента моему выдуманному alreadyCalledOnSaveInstanceState()
.
goTo(menuItem)
. Это сработало для моих целей - фрагмент никогда не меняется местами. Лучше, чем разбиться. - person NSouth   schedule 09.11.2015