7

私には2つの活動があり、使用しています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) {

          }
      }

2 番目のポートレートからランドスケープへの 1 つの有効な使用法です が、向きが変わると、アクティビティが読み込まれ、データが失われます

データを保存してアクティビティの方向を変更するにはどうすればよいですか?

4

6 に答える 6

16

データが小さい場合は、データを保存して復元することができますonSavedInstanceStateonRestoreInstanceState詳細については、このリンクを参照してくださいデータの保存

ただし、大きなデータがある場合は、方向の変更を許可しないでください (アクティビティの再作成を強制します)。マニフェスト ファイルに以下の行を追加することで制限できます。

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

この投稿をお勧めします

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

この問題の解決策をまだ探している人に。著者は、フラグメントを使用してデータを保持する方法について説明します。

必ず電話をかけてください

setRetainInstance(true);

onCreate()あなたのフラグメントの方法で!

于 2014-04-22T18:53:15.590 に答える
4

onSaveInstanceState(Bundle)て、onRestoreInstanceState(Bundle)

于 2012-08-31T11:41:04.223 に答える
3

以下のサンプルアプリケーション「マルチレゾリューション」を確認してください。「マルチレゾリューション」のコードのスニペットを見ることができます

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

public Object 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 に答える