保存数据并更改方向

我有两个活动,我使用android:configChanges="keyboardHidden|orientation|screenSize"

  @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_main); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { } } 

一个主动用于纵向横向的第二个方向, 但是当方向改变时,活动被加载并且数据丢失

如何保存数据并更改活动方向?

如果您的数据较less,则可以使用onSavedInstanceStateonRestoreInstanceState保存并获取它。对于deatils,请通过此链接保存数据

但是,如果你有大量的数据,那么我必须说你不应该允许方向的变化,你可以通过在清单文件中添加下面一行来限制它:

 android:configChanges="orientation|keyboardHidden" // fixes orientation 

请参阅onSaveInstanceState(Bundle)onRestoreInstanceState(Bundle)

你应该在下面查看示例应用程序“多分辨率”,你可以看到“多分辨率”代码片段

 public final class MultiRes extends Activity { private int mCurrentPhotoIndex = 0; private int[] mPhotoIds = new int[] { R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7 }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); showPhoto(mCurrentPhotoIndex); // Handle clicks on the 'Next' button. Button nextButton = (Button) findViewById(R.id.next_button); nextButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mCurrentPhotoIndex = (mCurrentPhotoIndex + 1) % mPhotoIds.length; showPhoto(mCurrentPhotoIndex); } }); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("photo_index", mCurrentPhotoIndex); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { mCurrentPhotoIndex = savedInstanceState.getInt("photo_index"); showPhoto(mCurrentPhotoIndex); super.onRestoreInstanceState(savedInstanceState); } private void showPhoto(int photoIndex) { ImageView imageView = (ImageView) findViewById(R.id.image_view); imageView.setImageResource(mPhotoIds[photoIndex]); TextView statusText = (TextView) findViewById(R.id.status_text); statusText.setText(String.format("%d/%d", photoIndex + 1, mPhotoIds.length)); } } 

我推荐这个职位

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

任何人仍然在寻找解决这个问题的方法。 作者介绍了如何使用片段来保留数据。

确保有电话

 setRetainInstance(true); 

在你的片段的onCreate()方法!

方法是onSaveInstanceState() ,系统在用户离开活动时调用它。 当系统调用这个方法时,它会传递一个Bundle对象,这个对象将在你的活动被意外销毁的情况下被保存,所以你可以添加额外的信息。 然后,如果系统在被销毁之后必须重新创build活动实例,它会将相同的Bundle对象传递给您的活动的onRestoreInstanceState()方法以及您的onCreate()方法。

请参阅http://developer.android.com/training/basics/activity-lifecycle/recreating.html

您可以通过覆盖public Object onRetainNonConfigurationInstance()来保存任何对象,并在您的onCreate方法中调用getLastNonConfigurationInstance()

 @Override public Object onRetainNonConfigurationInstance() { return data; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); data = getLastNonConfigurationInstance(); } 

但如果你这样做,你必须改变你的清单和代码,所以使用正常的configuration更改过程。

与SavedInstance方法不同的是,如果由于configuration更改而终止活动,则仅保存该对象