保存数据并更改方向

时间:2012-08-31 11:39:34

标签: android orientation

我有两项活动,我使用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) {

          }
      }

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

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

6 个答案:

答案 0 :(得分:15)

如果您的数据较少,可以使用onSavedInstanceStateonRestoreInstanceState保存并恢复数据..有关详细信息,请点击此链接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