当用户在导航抽屉中选择一个项目时,我的应用程序会启动一个处理程序,等待抽屉关闭后调用代码来替换主Activity中的片段。然而,如果设备在延迟期间旋转,我会收到一个IllegalStateException异常。
我阅读了这篇关于片段事务和生命周期的精彩文章,但我不确定如何在我的代码中处理这个问题。我明白我不应该在onSaveInstanceState()之后尝试提交事务。但是,我怎么知道onSaveInstanceState()是否已被调用?我想做这样的事情。
我阅读了这篇关于片段事务和生命周期的精彩文章,但我不确定如何在我的代码中处理这个问题。我明白我不应该在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)
的地方加了一个try/catch。 这对我的目的很有效 - 片段永远不会被交换,这比崩溃要好。 - NSouth