后按时从 onCreate() 开始片段

Posted

技术标签:

【中文标题】后按时从 onCreate() 开始片段【英文标题】:Start fragment from onCreate() when Back Pressed 【发布时间】:2021-09-09 16:04:55 【问题描述】:

我有两个片段。 fragment1 的 onCreate() 中有一些代码。 当我在fragment2 并按回时,它会转到fragment1 并从onCreateView() 开始。但我需要运行 onCreate() 中的代码。

活动中:

getSupportFragmentManager().beginTransaction().
                replace(R.id.host_fragment, new Fragment1()).commit();

在片段 1 中,我有导航到片段 2 的按钮:

getParentFragmentManager().beginTransaction().addToBackStack("").
                        replace(R.id.host_fragment,Fragment2).commit();

而且我在活动中没有任何 onBackPressed() 代码。

有片段的Activity,不是 MainActivity。java

谢谢。

【问题讨论】:

只使用 onCreateView() 而不是 onCreate 有什么问题? 如果您希望每次创建视图时都运行代码,为什么您的代码在 onCreate() 而不是 onCreateView() 我把我的非图形初始化放在onCreate(). 【参考方案1】:

我认为,您不必这样做,已经可以了。当您将 fragment1 放入 backstack 然后按回时,仅当先前实例化的 fragment1 实例在内存中时,才会调用 fragment1 的onCreateView()。如果不在内存中,则相应地调用所有片段生命周期回调,包括onCreate()

所以,如果您在onCreate() 中进行非图形初始化,当您按下返回时,它们已经初始化;或者如果它被创建为新的,至少会被初始化。所有这些都将由片段管理器管理。

【讨论】:

【参考方案2】:

你有什么理由把你的代码放在OnCreate() 里吗? 如果不是,则将您的代码放入OnCreateView()‍‍‍‍‍‍‍,因为OnCreateView()OnCreate() 之后被调用。因此,如果您想在片段创建时调用该代码,则可以保证调用您的代码。 此外,如果您查看片段生命周期,您可以看到如果从后台堆栈返回片段,则将调用其OnCreateView() 方法。因此,当您从第二个片段返回时,您的代码将运行。

【讨论】:

【参考方案3】:

简单的工作流程是将每次需要执行的代码从onCreate() 方法移动到onResume()

onResume() 每次用户关注屏幕时都会调用。或者从背景到前景。

【讨论】:

【参考方案4】:

谢谢大家的回答。

一开始我以为我的问题只是因为onCreate(),但是当我将代码放入onCreateView() 之后,我的问题仍然存在。

所以,我决定在 Back Pressed 时重新启动片段。所以我想出了这个解决方案:

在活动中:

@Override
public void onBackPressed() 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) 
        getSupportFragmentManager().popBackStack();
        getSupportFragmentManager().beginTransaction().
                replace(R.id.host_fragment, new Fragment1()).commit();
     else 
        super.onBackPressed();
    

这样有效率吗?

【讨论】:

以上是关于后按时从 onCreate() 开始片段的主要内容,如果未能解决你的问题,请参考以下文章

从活动接收意图后如何创建片段?

导航组件防止在后按时重新创建片段

底部导航栏的 Oncreate 视图问题

Android AsyncTask 不运行

添加片段后,前一个片段仍然可见

在活动OnCreate中加载片段