首页 文章

如何在旋转期间保存活动中每个片段的私有变量?

提问于
浏览
0

我有一个带有NavigationDrawer的Activity,所以我有几个碎片:

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = mDrawerTitle = getTitle();
        mDrawerMenu = (ListView) findViewById(R.id.drawer_menu);

        mProfileFragment = new ProfileFragment();
        mMainPageFragment = new MainPageFragment();
        mTestPageFragment = new TestPageFragment();
        mSettingsPageFragment = new SettingsPageFragment();
        mOnlineNeededFragment = new OnlineNeededFragment();
        mRegistrationFragment = new RegistrationFragment();
        mAuthorizationPageFragment = new AuthorizationFragment();

        //Adding fragments to NavigationDrawer

    }

    //selecting Fragment from NavigationDrawer
    private void selectItem(int position) {
        Fragment fragment = mDrawerMenuItems.get(position).getPage();

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, fragment)
                .commit();

        //...
    }

    //...
}

每个片段都有自己的私有变量,我保存

public class MainPageFragment extends Fragment {

    private int var1;
    private Date var2;
    private Date var3;

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            var1 = savedInstanceState.getInt("var1");
            var2 = (Date) savedInstanceState.getSerializable("var2");
            var3 = (Date) savedInstanceState.getSerializable("var3");
        }

        //...
    }

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

        outState.putInt("var1", var1);
        outState.putSerializable("var2", var2);
        outState.putSerializable("var3", var3);
    }
}

并在“onCreateView”中恢复 . 但是所有我旋转屏幕活动重新创建所有碎片,所以我在所有碎片中丢失了我的旧状态 .

我找到了“getSupportFragmentManager() . putFragment(outState,TAG,Fragment)” . 此函数可以将Fragment的实例保存到Bundle并稍后使用“getSupportFragmentManager() . getFragment(savedInstanceState,TAG)”将其恢复,因此Activity不会重新创建此Fragment并且不会丢失私有变量 .

但是FragmentManager只能保存一个片段,这个片段在FragmentManager中 . 当我尝试将所有片段放入Bundle时,我得到例外:“片段ProfileFragment {41a27730}当前不在FragmentManager中” .

如何在Bundle中保存所有碎片以在旋转屏幕后恢复它们?

1 回答

  • 1

    你的问题在于onCreate方法总是创建一个新的Fragment

    mProfileFragment = new ProfileFragment();
        mMainPageFragment = new MainPageFragment();
        mTestPageFragment = new TestPageFragment();
        mSettingsPageFragment = new SettingsPageFragment();
        mOnlineNeededFragment = new OnlineNeededFragment();
        mRegistrationFragment = new RegistrationFragment();
        mAuthorizationPageFragment = new AuthorizationFragment();
    

    放一个if语句来检查它是否为null .

    if (savedInstanceState == null) {
        mProfileFragment = new ProfileFragment();
        mMainPageFragment = new MainPageFragment();
        mTestPageFragment = new TestPageFragment();
        mSettingsPageFragment = new SettingsPageFragment();
        mOnlineNeededFragment = new OnlineNeededFragment();
        mRegistrationFragment = new RegistrationFragment();
        mAuthorizationPageFragment = new AuthorizationFragment();
    

相关问题