如何正确保存和还原嵌套片段的实例?

问题描述

我有一个正在使用嵌套片段的活动。我可以看到许多客户第一次访问变量时发生的崩溃,因为它们仍然为空。我认为这与更改前台应用程序时使用saveInstanceState重新创建的活动和/或片段有关。 该活动将自身设置为片段中的变量,因此我可以将其用于某些Android函数。但是我无法使活动在片段中可序列化,因此我被迫寻求一个丑陋的解决方案,其中即使使用非null saveInstanceState来重新创建活动,我也总是重新创建片段。

也许在某些情况下,仅使用非null savedInstanceState而不是活动来重新创建片段?无论如何,我想知道什么是最好的解决方案,以便活动和片段可以正确恢复其状态,以及如何保持片段与活动变量之间的连接。

public class BaseSettingsActivity extends Activity {
    public BaseSettingsFragment mPrefFragment;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPrefFragment = new BaseSettingsFragment();
        if (savedInstanceState != null) {
            mPrefFragment.baseSettingsData.fromSavedInstance(savedInstanceState);
        } else {
            mPrefFragment.baseSettingsData.fromIntent(getIntent(),this);
        }
        mPrefFragment.context=this;
        mPrefFragment.activity=this;

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(android.R.id.content,prefFragment);
        fragmentTransaction.commit();
        }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        mPrefFragment.baseSettingsData.toSavedInstance(outState);
        super.onSaveInstanceState(outState);
    }       
    
    public static class BaseSettingsFragment extends PreferenceFragment {
        public BaseSettingsData baseSettingsData=new BaseSettingsData();
        public Context context; // how to keep context in fragment for saved instances?
        public BaseSettingsActivity activity;  // how to keep activity variable in fragment for saved instances?
    
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            int d=baseSettingsData.mAppSettings.speed; // creates nullpointer crash for some customers
        }
    
    }
}


public class BaseSettingsData {
    public AppSettings mAppSettings;
    public void toIntent(Intent intent) {
        intent.putExtra("appSettings",mAppSettings);
    }

    public void fromIntent(Intent data,Context context) {
        mAppSettings = (AppSettings) data.getSerializableExtra("appSettings");
    }

    public void toSavedInstance(Bundle outState) {
        outState.putSerializable("appSettings",mAppSettings);
    }

    public void fromSavedInstance(Bundle savedInstanceState) {
        mAppSettings=(AppSettings)savedInstanceState.getSerializable("appSettings");
    }
}   


public class AppSettings implements Serializable {
    public int speed=6;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)