首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onStart()未被调用

onStart()未被调用
EN

Stack Overflow用户
提问于 2019-08-04 19:06:01
回答 1查看 496关注 0票数 0

我的应用程序有一个主要的活动,其中包含5个片段。一切正常,除非我关闭应用程序并重新启动它,然后应用程序会打开一个空白屏幕(即没有加载片段),而不是指定的默认片段。因此,我试图重写onStart(),但现在它正因以下错误而崩溃:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
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();
    }
}

我只是希望能够打开默认的片段,如果应用程序是要恢复或重新启动。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-04 19:34:42

看到空白屏幕的原因是因为您在活动的onCreate()中启动了一个片段事务,根据应用程序的生命周期,只调用了一次。如果您的活动在onCreate()中停止,它将遵循一个模式,即onCreate() -> onPause() -> onStop() -> onSaveInstance()

您需要做的是覆盖onPostResume()并在那里启动片段事务。当活动完全解决并可见时,将调用此回调。而且,commit()并不意味着它将立即提交事务,而是计划它,这解释了为什么会抛出此异常,因为提交发生在活动不再可用时。

发布蜂巢后,onStop()之后的活动被认为是可杀死的

代码语言:javascript
复制
 @Override
protected void onPostResume() {
    super.onPostResume();

   if (getSupportFragmentManager().findFragmentById(R.id.fragment_container) == null)
        openOrders();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57349463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档