【问题标题】:Restore savedInstanceState before Fragments onCreate method在 Fragments onCreate 方法之前恢复 savedInstanceState
【发布时间】:2014-09-28 16:01:16
【问题描述】:

我制作了一个测试应用程序,以便学习如何保存InstanceState

现在我们有一个 Main Fragment Activity 和两个 Tab Fragment。我在 Main Activity 中有一个变量,它的值位于 onCreate 方法中。我想与片段共享它。

所以我在 Main Activity 中创建了一个公共方法,以便在我需要该变量的值时在片段中调用它。 ((TMainActivity) getActivity()).getTestString()

问题是当设备旋转时,我得到了字符串的默认值,而不是保存的值。

这显然是因为onRestoreInstanceState 是在片段的onCreate 之后调用的。

现在,我该如何解决?

TMainActivity.java

public class TMainActivity extends FragmentActivity {

    final private static String TAG = "TMainActivity";
    final private static String EXTRA_TEST = "MAIN_KEY";

    private CollectionPagerAdapter mCollectionPagerAdapter;
    private ViewPager mainPager;

    private String test = "Default";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.v(TAG, "onCreate() Before test= " + test);

        if (savedInstanceState == null) {
            test = "New";
        } else {
            test = savedInstanceState.getString(EXTRA_TEST) + " - Restored";
        }

        Log.v(TAG, "onCreate() After test= " + test);

        mainPager = (ViewPager) findViewById(R.id.main_pager);

        mCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());
        mainPager.setAdapter(mCollectionPagerAdapter);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        Log.v(TAG, "onSaveInstanceState()");

        outState.putString(EXTRA_TEST, test);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        Log.v(TAG, "onRestoreInstanceState()");
        Log.v(TAG, "onRestoreInstanceState() savedInstanceState=" + (savedInstanceState != null));

        test = savedInstanceState.getString(EXTRA_TEST);
    }

    public String getTestString() {
        return test;
    }

    private class CollectionPagerAdapter extends FragmentStatePagerAdapter {
        public CollectionPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = null;

            switch (i) {
            case 0:
                fragment = new Tab1Fragment();
                break;
            case 1:
                fragment = new Tab2Fragment();
                break;
            }

            return fragment;
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "OBJECT " + (position + 1);
        }
    }

}

Tab1Fragment.java

public class Tab1Fragment extends Fragment {

    final private static String TAG = "Tab1Fragment";

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

        Log.v(TAG, "onCreate()");
        Log.v(TAG, "getTestString()=" + ((TMainActivity) getActivity()).getTestString());
    }

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

}

Tab2Fragment.java

public class Tab2Fragment extends Fragment {

    final private static String TAG = "Tab2Fragment";

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

        Log.v(TAG, "onCreate()");
        Log.v(TAG, "getTestString()=" + ((TMainActivity) getActivity()).getTestString());
    }

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

        return rootView;
    }

}

【问题讨论】:

    标签: android android-fragments savestate


    【解决方案1】:

    我也遇到了同样的问题。首先在 Activity 中称为 onCreate,在此方法中,您已经可以使用包含数据的 Bundle。这意味着您可以恢复Activity,然后使用稍后调用的Fragment的onCreateView中的数据。

    基本上你不会重写onRestoreInstanceState() 方法,而是重命名它并在你的Activity 中从onCreate 调用它。不覆盖该方法的原因是因为它会被调用两次——从onCreate 由您调用,然后作为 Activity 生命周期的一部分。如果在 Fragment 中更改了值,这将重置该值。

    在你的情况下,你可以移动

    Log.v(TAG, "getTestString()=" + ((TMainActivity) getActivity()).getTestString());
    

    onCreateonCreateView

    当您恢复大量数据时,这不是一个好的解决方案。您的 UI 线程将在恢复 Activity 时卡住。但在这种情况下,您可以只恢复 Fragment 中所需的部分数据,而将其余数据恢复到 onRestoreInstanceState

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2018-04-16
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多