3

この質問を投稿する前に、次のリンクを見ました

http://www.devx.com/wireless/Article/40792/1954

インスタンス状態の保存を使用してAndroidアクティビティの状態を保存する

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

状態が私のクラスで構成されている場合、Androidで向きの変更中に状態を保存するにはどうすればよいですか?

次の関数をオーバーライドする方法がわかりません:

@Override
    public Object onRetainNonConfigurationInstance() {
        return someExpensiveObject;
    }

私のアプリケーションでは、最初のeditextのデータがtrueに検証されると、1つのeditextが表示され、他のeditextが表示されるレイアウトがあります。他のすべてのeditextとtextviewの可視性をfalseに設定し、検証後にそれらを表示します。

したがって、私のアクティビティでは、画面の向きが変更されると、すべてのアイテムがandroid:visibility="false"非表示になります。

また、アクティビティ画面の向きが変わると、onStop()を呼び出してからonDestroy()を呼び出し、次にonCreate()を呼び出して新しいアクティビティを再開することもわかりました。

これが原因です..しかし、私はそれを解決する方法を取得していません..

ここに私のアプリケーションのスクリーンショットを見ることができます:

ここに画像の説明を入力してください この画像ではすべてのフィールドが読み込まれ、別の画像では画面の向きが横向きに変更されるとすべて消えます

ここに画像の説明を入力してください

チュートリアルやコードへのリンクは非常に高く評価されます。

また、進行状況ダイアログが表示され、画面の向きを変更しようとすると、アプリケーションがクラッシュします。これを処理するにはどうすればよいですか?

ありがとう

4

3 に答える 3

7

両方の画面で同じものがある場合は、layoutそうする必要はありません。inノードに以下の行を追加するだけmanifestですActivity

android:configChanges="keyboardHidden|orientation"

Android 3.2(APIレベル13)以降の場合:

android:configChanges="keyboardHidden|orientation|screenSize"

デバイスが縦向きと横向きを切り替えると、「画面サイズ」も変化するためです。こちらのドキュメント:http://developer.android.com/guide/topics/manifest/activity-element.html

于 2011-11-11T11:24:13.750 に答える
1

onConfigurationChanged(Configuration newConfig)を使用して方向を変更しても、状態をそのまま維持できる別の可能性があります。

アクティビティの実行中にデバイス構成が変更されたときにシステムによって呼び出されます。これは、マニフェストのconfigChanges属性で処理する構成を選択した場合にのみ呼び出されることに注意してください。その属性によって報告されるように選択されていない構成変更が発生した場合、それを報告する代わりに、システムはアクティビティを停止して再開します(新しい構成で起動するため)。

この関数が呼び出された時点で、Resourcesオブジェクトが更新され、新しい構成に一致するリソース値が返されます。

于 2012-07-23T07:27:20.640 に答える
0

これを行うには2つの方法があり、最初の方法はAndroidManifest.xmlファイルにあります。これをアクティビティのタグに追加できます。このドキュメントでは詳細な説明を提供しますが、簡単に言えば、これらの値を使用し、これらの値の1つが変更されたときに再起動しないようにアクティビティに指示します。

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"

そして2つ目は:オーバーライドonSaveInstanceStateonRestoreInstanceState。この方法にはもう少し手間がかかりますが、間違いなく優れています。onSaveInstanceStateアクティビティが強制終了される前に、アクティビティから(開発者が手動で)設定した値を保存し、onRestoreInstanceState後でその情報を復元します。詳細についてonStart() は、公式ドキュメントを参照してください。を実装する必要はありませんがonRestoreInstanceState、そのコードをに固定する必要がありますonCreate()

以下のサンプルコードintでは、スピナーの現在の位置とラジオボタンの2つの値を保存しています。

 @Override
    public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
        spinPosition = options.getSelectedItemPosition();
        savedInstanceState.putInt(Constants.KEY, spinPosition);
        savedInstanceState.putInt(Constants.KEY_RADIO, radioPosition);
        super.onSaveInstanceState(savedInstanceState);

    }

    // And we restore those values with `getInt`, then we can pass those stored values into the spinner and radio button group, for example, to select the same values that we saved earlier. 

    @Override
    public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
        spinPosition = savedInstanceState.getInt(Constants.KEY);
        radioPosition = savedInstanceState.getInt(Constants.KEY_RADIO);
        options.setSelection(spinPosition, true);
        type.check(radioPosition);
        super.onRestoreInstanceState(savedInstanceState);
    }
于 2020-04-27T13:23:12.303 に答える