为了账号安全,请及时绑定邮箱和手机立即绑定

总之,如何在后台堆栈中正确保存片段的实例状态?

总之,如何在后台堆栈中正确保存片段的实例状态?

米脂 2019-06-06 13:33:39
总之,如何在后台堆栈中正确保存片段的实例状态?我在此发现了许多类似问题的例子,但不幸的是,没有一个答案符合我的要求。我有不同的人像和景观布局,我使用的是后堆栈,这两种方式都阻止了我使用。setRetainState()以及使用配置更改例程的技巧。我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。当仅使用活动编写应用程序时,以下内容运行良好:TextView vstup;@Overridepublic void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.whatever);     vstup = (TextView)findViewById(R.id.whatever);     /* (...) */}@Overridepublic void onSaveInstanceState(Bundle state) {     super.onSaveInstanceState(state);     state.putCharSequence(App.VSTUP, vstup.getText());}@Overridepublic void onRestoreInstanceState(Bundle state) {     super.onRestoreInstanceState(state);     vstup.setText(state.getCharSequence(App.VSTUP));}带着Fragment这只在非常特殊的情况下起作用。具体来说,最糟糕的是替换一个片段,将它放在后面的堆栈中,然后在显示新片段时旋转屏幕。据我所知,旧片段没有接到呼叫onSaveInstanceState()当被替换,但仍然以某种方式链接到Activity稍后,当它的View已经不存在了,所以找我的TextView将结果转化为NullPointerException.同时,我发现保持对我TextViews不是个好主意FragmentS,即使你不介意Activity那样的话,onSaveInstanceState()实际上保存了状态,但是如果我旋转屏幕,问题就会再次出现。两次当碎片被隐藏时onCreateView()不会在新实例中调用。我想在onDestroyView()变成一些Bundle-类型为类成员元素(实际上是更多的数据,而不仅仅是一个TextView)和储蓄那,那个在……里面onSaveInstanceState()但是还有其他的缺点。主要是,如果碎片是目前显示的是,调用这两个函数的顺序是相反的,因此我需要考虑两种不同的情况。必须有一个更清洁和正确的解决方案!
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

若要正确保存Fragment你应该做以下几件事:

1.在片段中,通过重写来保存实例状态。onSaveInstanceState()和恢复onActivityCreated():

@Overridepublic void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ...
    if (savedInstanceState != null) {
        //Restore the fragment's state here
    }}...@Overridepublic void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Save the fragment's state here}

2.重点,在活动中,您必须将片段的实例保存在onSaveInstanceState()和恢复onCreate().

public void onCreate(Bundle savedInstanceState) {
    ...
    if (savedInstanceState != null) {
        //Restore the fragment's instance
        mContent = getSupportFragmentManager().getFragment(savedInstanceState, "myFragmentName");
        ...
    }
    ...}@Overrideprotected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Save the fragment's instance
    getSupportFragmentManager().putFragment(outState, "myFragmentName", mContent);}

希望这能帮上忙。


查看完整回答
反对 回复 2019-06-06
  • 2 回答
  • 0 关注
  • 512 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信