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

时间:2013-08-25 10:44:43

标签: android android-fragments onresume back-stack

我正在使用多个fragment来动态添加到activity中。一切正常,当我按下后退按钮时,fragment转到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;
}

我想阻止那些fragment重新创建。我试过onSavedInstanstate,但没有任何效果。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:9)

在活动onCreateView中,在调用super方法之前将savedInstanceState设置为null。你也可以只删除键" android:viewHierarchyState"和" android:碎片"来自savedInstanceState包。这是简单解决方案的代码,使状态为零:

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

    ...
}

答案 1 :(得分:4)

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

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

不幸的是,棘手的部分是找到提交此交易的最佳位置。根据{{​​3}},安全的地方并不多。也许您可以在FragmentActivity.onResumeFragments()Fragment.onResume()内尝试。

答案 2 :(得分:4)

Iam使用了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;
    }
}

我将视图变量放在类中并仅在视图实例为null或以其他方式使用之前创建的视图时将其膨胀为新的