恢复后停止重新创建片段?

Posted

技术标签:

【中文标题】恢复后停止重新创建片段?【英文标题】:Stop fragment from being recreated after resume? 【发布时间】:2013-08-27 23:59:43 【问题描述】:

我正在使用几个fragments 动态添加到activity。一切正常,当我按下返回按钮时,fragments 转到backstack。当我resume 它时,它就会出现。但每次在Resume 上,它都会重新创建fragment 并调用onCreateView。我知道这是fragment 生命周期的正常行为。

这是我的onCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    View rootView = inflater.inflate(
            R.layout.competitive_programming_exercise, container, false);
    return rootView;

我想阻止那些fragments 重新创建。我尝试使用onSavedInstanstate,但没有任何效果。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

在Activity的onCreateView中,在调用super方法之前将savedInstanceState设置为null。您还可以从 savedInstanceState 包中仅删除键“android:viewHierarchyState”和“android:fragments”。这是简单解决方案的代码,将状态归零:

@Override
public void onCreate(Bundle savedInstanceState)

    savedInstanceState = null;
    super.onCreate(savedInstanceState);

    ...

【讨论】:

【参考方案2】:

我正在使用 5 个片段并为我工作得很好,因为我之前遇到过同样的问题..

public class MyFragmentView1 extends Fragment 

    View v;
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, 
                @Nullable Bundle savedInstanceState) 
        if (v == null) 
            v = inflater.inflate(R.layout.my_fragment_view_layout, 
                container, false
            );
        return v;
    

我将视图变量放在类中,并且仅当视图实例为空或使用之前创建的实例时才将其膨胀为新的

【讨论】:

如何在 kotlin 中解决这个问题 对不起难波。我不知道科特林。最好你提出一个新问题,然后你会在 *** 中得到答案。【参考方案3】:

很遗憾,您无法阻止片段被重新创建。您可以做的最好的事情是在事务中删除片段,在它恢复之后但在它显示之前。

如果您知道要立即删除片段,则可以通过简化方法(例如 onCreateView())来返回虚拟视图,而不是再次膨胀整个视图层次结构,从而降低恢复片段的性能损失。

不幸的是,棘手的部分是找到提交此事务的最佳位置。根据this article,安全的地方并不多。也许你可以在FragmentActivity.onResumeFragments() 或者Fragment.onResume() 里面试试。

【讨论】:

感谢您的回复!一些代码示例会很有帮助! :)

以上是关于恢复后停止重新创建片段?的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager 片段重新创建,已恢复但不可见

重新附加时片段创建/恢复重复视图

带有片段和 Jetpack 导航的 Viewpager2:恢复片段而不是重新创建它们

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

如何创建一个倒数计时器,当屏幕关闭时停止并“等待”,重新打开时恢复。安卓

Android - 恢复 Fragment WebView 状态以避免重新加载