我有两项活动,我使用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) {
}
}
一个主动用于纵向到第二个的横向方向 但是当方向发生变化时,会加载活动并且数据会丢失
如何保存数据并更改活动方向?
答案 0 :(得分:15)
如果您的数据较少,可以使用onSavedInstanceState
和onRestoreInstanceState
保存并恢复数据..有关详细信息,请点击此链接Saving data
但是,如果您拥有大量数据,那么我必须说,您不应该允许方向更改(这会强制您的活动重新创建)。您可以通过在清单文件中添加以下行来限制它:
android:configChanges="orientation|keyboardHidden" // fixes orientation
答案 1 :(得分:4)
请参阅onSaveInstanceState(Bundle)
和onRestoreInstanceState(Bundle)
答案 2 :(得分:4)
我推荐这篇文章
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
任何仍在寻找此问题解决方案的人。作者介绍了如何使用 Fragment 来保留数据。
确保接听电话
setRetainInstance(true);
在片段的onCreate()
方法中!
答案 3 :(得分:3)
您应该在下面查看示例应用程序“Multiresolution”,您可以看到“Multiresolution”的代码片段
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));
}
}
答案 4 :(得分:1)
您可以通过覆盖public Object onRetainNonConfigurationInstance ()来保存任何对象
并在你的onCreate方法中调用getLastNonConfigurationInstance()
。
@Override
public Object onRetainNonConfigurationInstance() {
return data;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
data = getLastNonConfigurationInstance();
}
但是如果你这样做,你必须更改你的清单和代码,所以使用了配置更改的正常过程。
与SavedInstance方法不同,只有在活动因配置更改而被杀死时才会保存对象
答案 5 :(得分:0)
方法为onSaveInstanceState()
,系统会在用户离开您的活动时调用它。当系统调用此方法时,它会传递Bundle
对象,如果您的活动被意外销毁,将保存该对象,以便您可以向其中添加其他信息。然后,如果系统必须在销毁后重新创建活动实例,它会将相同的Bundle
对象传递给您的活动的onRestoreInstanceState()
方法,并传递给您的onCreate()
方法。
参考http://developer.android.com/training/basics/activity-lifecycle/recreating.html