51

画面の回転を処理する最良の方法は何かを考え出すことに夢中になっています。ここで何百もの質問/回答を読みましたが、本当に混乱しています。

アクティビティが再作成される前に myClass データを保存して、無駄な初期化を行わずにアクティビティを再描画するためにすべてを保持するにはどうすればよいですか?

小包化よりもクリーンで良い方法はありますか?

ランドスケープ モードでレイアウトを変更したいので、回転を処理する必要があります。

public class MtgoLifecounterActivity extends Activity {

    MyClass myClass;

    // Called when the activity is first created
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        If ( ?? first run...myClass == null ? ) {
            myClass = new MyClass();
        } else {
            // do other stuff but I need myClass istance with all values.
        }
        // I want that this is called only first time. 
        // then in case of rotation of screen, i want to restore the other instance of myClass which
        // is full of data.
    }
4

8 に答える 8

49

マニフェストのアクティビティタグで言及する必要があります

<activity
        android:name="com.example.ListActivity"
        android:label="@string/app_name" 
        android:configChanges="keyboardHidden|orientation">

Android 2.3(API レベル 13) 以上を使用している場合

<activity
        android:name="com.example.Activity"
        android:label="@string/app_name" 
        android:configChanges="keyboardHidden|orientation|screenSize">

動作する必要があります。

アプリケーションタグではなく、アクティビティタグでのみ機能します

于 2013-11-29T06:22:56.890 に答える
28

オーバーライドメソッドonSaveInstanceState()とを使用できますonRestoreInstanceState()onCreate()または、画面の回転での呼び出しを停止するには、マニフェストxmlにこの行を追加するだけですandroid:configChanges="keyboardHidden|orientation"

注:カスタムクラスはParcelable、以下の例を実装する必要があります。

@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("obj", myClass);
    }

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onRestoreInstanceState(savedInstanceState);
 myClass=savedInstanceState.getParcelable("obj"));
}

public class MyParcelable implements Parcelable {
     private int mData;

 public int describeContents() {
     return 0;
 }

 /** save object in parcel */
 public void writeToParcel(Parcel out, int flags) {
     out.writeInt(mData);
 }

 public static final Parcelable.Creator<MyParcelable> CREATOR
         = new Parcelable.Creator<MyParcelable>() {
     public MyParcelable createFromParcel(Parcel in) {
         return new MyParcelable(in);
     }

     public MyParcelable[] newArray(int size) {
         return new MyParcelable[size];
     }
 };

 /** recreate object from parcel */
 private MyParcelable(Parcel in) {
     mData = in.readInt();
 }


}
于 2012-04-12T15:37:29.200 に答える
5

アクティビティを再開する必要がない場合は、AndroidManifest.xmlのアクティビティのconfigChanges属性を次のように設定するだけです。

    android:configChanges="keyboard|keyboardHidden|orientation"

これにより、ローテーションの処理を処理することをOSに通知し、アクティビティを再開しません。この方法を使用すると、あらゆる種類の状態を保存する必要がなくなります。

于 2012-04-12T15:37:04.387 に答える
4

これには2つの(良い)方法があります。クラスにParcelableを実装させて、のバンドルに入れます。onSaveInstanceState()より複雑な場合(AsyncTaskなど)は、に返しonRetainNonConfigurationInstance()ます。

次に、構成の変更に反応するのをやめるという怠惰な方法もあります。

于 2012-04-12T15:37:38.723 に答える