13

我正在使用几个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但没有任何效果。我怎样才能做到这一点?

4

3 回答 3

10

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

@Override
public void onCreate(Bundle savedInstanceState)
{
    savedInstanceState = null;
    super.onCreate(savedInstanceState);

    ...
}
于 2014-08-19T10:48:21.510 回答
10

我正在使用 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;
    }
}

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

于 2016-07-02T11:16:58.130 回答
5

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

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

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

于 2013-08-25T11:01:50.087 回答