我的应用程序有一个主要的活动,其中包含5个片段。一切正常,除非我关闭应用程序并重新启动它,然后应用程序会打开一个空白屏幕(即没有加载片段),而不是指定的默认片段。因此,我试图重写onStart(),但现在它正因以下错误而崩溃:
08-04 10:59:42.748 27413-27413/com.paraway.partner E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.paraway.partner, PID: 27413
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:1536)
at androidx.fragment.app.FragmentManagerImpl.enqueueAction(FragmentManagerImpl.java:1558)
at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:317)
at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:282)
at com.eataway.partner.MainActivity.openOrders(MainActivity.java:42)
at com.eataway.partner.MainActivity.onStart(MainActivity.java:93)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1265)
at android.app.Activity.performStart(Activity.java:6915)
at android.app.Activity.performRestart(Activity.java:6974)
at android.app.ActivityThread.handleSleeping(ActivityThread.java:4864)
at android.app.ActivityThread.access$3600(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2031)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)MainActivity.class看起来是这样的:
public class MainActivity extends AppCompatActivity {
static final String TAG = MainActivity.class.getSimpleName();
private Bundle bundle = new Bundle();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(navigationItemSelectedListener);
openOrders();
}
// Open default/main fragment
private void openOrders() {
bundle.putString("userId", getUser());
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrdersFragment()).commit();
}
private BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelectedListener = menuItem -> {
// Handling bottom navigation
return true;
};
private String getUser() {
// non relevant code needed in the fragments
return userId;
}
@Override
protected void onStart() {
openOrders();
super.onStart();
}
}我只是希望能够打开默认的片段,如果应用程序是要恢复或重新启动。
发布于 2019-08-04 19:34:42
看到空白屏幕的原因是因为您在活动的onCreate()中启动了一个片段事务,根据应用程序的生命周期,只调用了一次。如果您的活动在onCreate()中停止,它将遵循一个模式,即onCreate() -> onPause() -> onStop() -> onSaveInstance()。
您需要做的是覆盖onPostResume()并在那里启动片段事务。当活动完全解决并可见时,将调用此回调。而且,commit()并不意味着它将立即提交事务,而是计划它,这解释了为什么会抛出此异常,因为提交发生在活动不再可用时。
发布蜂巢后,onStop()之后的活动被认为是可杀死的
@Override
protected void onPostResume() {
super.onPostResume();
if (getSupportFragmentManager().findFragmentById(R.id.fragment_container) == null)
openOrders();
}https://stackoverflow.com/questions/57349463
复制相似问题