Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何正确保存和恢复嵌套片段的实例?_Android_Android Fragments_Onsaveinstancestate - Fatal编程技术网

Android 如何正确保存和恢复嵌套片段的实例?

Android 如何正确保存和恢复嵌套片段的实例?,android,android-fragments,onsaveinstancestate,Android,Android Fragments,Onsaveinstancestate,我有一个使用嵌套片段的活动。在我第一次访问变量的客户那里,我可以看到很多崩溃,因为它们仍然为空。我认为这与前台应用程序更改时使用savedInstanceState重新创建的活动和/或片段有关。 活动将自身设置为片段中的一个变量,因此我可以将其用于一些Android函数。但我无法在片段中使活动可序列化,因此我被迫采用了一种丑陋的解决方案,即即使使用非null的savedInstanceState重新创建活动时,我也总是重新创建片段 可能仍然存在这样的情况:仅使用非null savedInstan

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

可能仍然存在这样的情况:仅使用非null savedInstanceState重新创建片段,而不使用活动?无论如何,我想知道什么是最好的解决方案,以便activity和fragment能够正确地恢复其状态,以及如何保持fragment与activity变量之间的连接

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;
}