13

EditTextアプリケーションが停止または強制終了されようとしているときに、Android がオブジェクトのコンテンツを自動的に保存することを読みました。ただし、私のアプリではEditText、画面の向きが変わると an の内容が失われます。

それは正常な動作ですか?onSaveInstanceState/ を使用してコンテンツを手動で保存/復元する必要がありonRestoreInstanceStateますか? または、Androidに保存して復元するように指示する簡単な方法はありますか?

編集

EditTextXML ではなく、プログラムでオブジェクトを作成します。これは問題に関連していることが判明しました(以下の受け入れられた回答を参照)。

4

4 に答える 4

28

これは正常な動作ではありません。

何よりもまずEditText、レイアウト XML でコントロールに ID が割り当てられていることを確認します。

編集 1: ID、ピリオドが必要です。これをプログラムで行っている場合は、ID がない限り状態が失われます。

したがって、これを簡単で汚い例として使用します。

    // Find my layout
    LinearLayout mLinearLayout = (LinearLayout) findViewById(R.id.ll1);
    // Add a new EditText with default text of "test"
    EditText testText = new EditText(this.getApplicationContext());
    testText.setText("test");


    // This line is the key; without it, any additional text changes will 
    // be lost on rotation. Try it with and without the setId, text will revert
    // to just "test" when you rotate.

    testText.setId(100); 

    // Add your new EditText to the view.
    mLinearLayout.addView(testText);

それはあなたの問題を解決します。

それが失敗した場合は、自分で状態を保存して復元する必要があります。

onSaveInstanceState次のようにオーバーライドします。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("textKey", mEditText.getText().toString());
}

そして、復元しOnCreateます:

public void onCreate(Bundle savedInstanceState) {
    if(savedInstanceState != null)
    {
        mEditText.setText(savedInstanceState.getString("textKey"));
    }
}

android:configChanges="orientation"また、これを達成しようとして使用しないでください。それは間違った方法です。

于 2013-10-07T21:18:45.387 に答える
2

考えられる原因の 1 つは、onSaveInstanceState をオーバーライドしたが、スーパー クラスに対して同じものを呼び出すのを忘れていることです。

super.onSaveInstanceState(outState);

この機能をオーバーライドしない限り、アクティビティ内のすべてのビューの状態は自動保存されます。これが明らかな場合でも、間違いが発生する可能性があります。

于 2016-05-19T06:36:02.373 に答える
2

android:freezesText="true"xml レイアウトで使用できますか?

于 2013-10-07T21:49:55.633 に答える