1

私の理解では、デバイスの向きを変更すると、アプリが破棄され、再度作成されます。これは、デバイスを回転させるたびに onCreate() を実行する必要があることを意味します。

画面が回転するたびに、アプリが作成されるたびに EditText を設定しようとしています。というわけで、アプリを起動すると、テキスト フィールドに「Bap」と表示されます。次に、フィールドの内容を「Boop」に変更し、画面を回転させます。フィールドに「Bap」と表示されることを期待しますが、そうではありません。変更後、方向変更前の状態のままです。どうしてこれなの?

私の onCreate() は次のようになります。

@Override
public void onCreate(Bundle savedInstanceState)
{    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    EditText editText = (EditText)findViewById(R.id.edit_message);
    editText.setText("Bap", TextView.BufferType.EDITABLE);
}

setText() 呼び出しを onResume() に移動すると、デバイスを回転させるたびにテキスト フィールドがリセットされ、すべてが期待どおりに機能することに注意してください。

注:同様の質問が寄せられていることは承知していますが、与えられた回答は、この動作が発生する理由を実際には説明していません。

4

3 に答える 3

3

これは、Android フレームワークが想定されていることを行っているために発生しています。アプリの現在の状態に関するすべての情報を含むバンドル (SavedInstanceState) を保存し、向きの変更後にビューを再作成するときに使用します。

投稿した onCreate から一部のコードを除外しましたか? たぶん次のようなものです:

if (savedInstanceState == null)

onCreate コードがそのような if でラップされている場合、期待する結果が得られないのはそのためです。

次のような onCreate を使用するのが標準的な方法です。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
                // Your first time start-up code here, will not run on orientation change   
    }
            // Any code you want to run EVERY time onCreate runs goes here
}

これは、方向の変更時にすべてを不必要に再作成しないようにするためです。

お役に立てれば!

編集

さらに調べてみると、何が起こっているかが次のように見えます (ここから収集):

デバイスの向きの変更

onSaveInstanceState(Bundle outState)
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState(Bundle inState)
onResume()

これは基本的に、バンドルが に渡されていることを示しています。これは のonRestoreInstanceStateonCreateに発生します。これにより、ケースで何が起こっているかが説明されます。

したがって、解決策は、 EditText 値の設定をonResumeメソッドに移動する (またはオーバーライドするonRestoreInstanceState) ことです。

于 2012-05-08T03:59:44.223 に答える
1

savedInstanceStateメソッドに渡されるを掘り下げることにしたところ、次のことがonCreateわかりました。

キー:android:viewHierarchyState
値:Bundle

そのバンドルには、次のキーと値のペアがありました。

キー:android:views
値:SparseArray

これSparseArrayには次の値がありました。TextView.SavedState{41857898 start=4 end=4 text=Boop}

何が起こっているのかというとView、おそらくonRestoreInstanceStateメソッド内で、Android がいくつかの s の状態を自動的に復元しているということです。

この動作を防ぐには、XML で次の行を に追加しますEditText

android:saveEnabled="false"

これをプログラムで行うには、 を呼び出しますview.setSaveEnabled(false)

于 2012-05-08T04:46:29.277 に答える
0

はい。アクティビティが再作成されると、onCreate で edittext に値を設定できません。onResume() で変更する必要があります。

于 2012-05-08T03:49:13.473 に答える