后按时从 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() 开始片段的主要内容,如果未能解决你的问题,请参考以下文章