7

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

          }
      }

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

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

4

6 回答 6

16

如果您有小数据,您可以使用onSavedInstanceStateonRestoreInstanceState.. 保存和恢复它。有关详细信息,请通过此链接保存数据

但是,如果您有大量数据,那么我必须说,您不应该允许方向更改(这会迫使您的活动重新创建)。您可以通过在清单文件中添加以下行来限制它:

android:configChanges="orientation|keyboardHidden" // fixes orientation
于 2012-08-31T11:47:53.787 回答
4

onSaveInstanceState(Bundle)onRestoreInstanceState(Bundle)

于 2012-08-31T11:41:04.223 回答
4

我推荐这篇文章

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

对于仍在寻找解决此问题的方法的任何人。作者描述了如何使用Fragment来保留数据。

确保接听电话

setRetainInstance(true);

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

于 2014-04-22T18:53:15.590 回答
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));
    }
}
于 2012-08-31T11:45:02.180 回答
2

您可以通过覆盖公共对象 onRetainNonConfigurationInstance () 并调用getLastNonConfigurationInstance()您的 onCreate 方法来保存任何对象。

@Override
    public Object onRetainNonConfigurationInstance() {


    return data;
    }


 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

         data = getLastNonConfigurationInstance();
    }

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

与 SavedInstance 方法不同,这仅在活动因配置更改而被终止时保存对象

于 2012-08-31T11:48:32.423 回答
0

该方法是onSaveInstanceState(),当用户离开您的活动时系统会调用它。当系统调用此方法时,它会传递Bundle将在您的活动被意外销毁时保存的对象,以便您可以向其添加附加信息。然后,如果系统必须在销毁活动实例后重新创建它,它会将相同的Bundle对象传递给您的活动onRestoreInstanceState()方法以及您的onCreate()方法。

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

于 2012-08-31T11:46:09.353 回答