通常、UIビューがその状態を保持しない場合、最初に確認することは、このUIビューにIDが割り当てられていることです。このIDがないと、ビューは状態を復元できません。
<EditText android:id="@+id/text" ... />
これで問題が解決しない場合は、自分で状態を保存して復元する必要があります。ランタイム変更の処理をご覧ください。それはあなたが何をすべきかをほとんど説明しています:
再起動を適切に処理するには、アクティビティが通常のアクティビティライフサイクルを通じて以前の状態を復元することが重要です。このライフサイクルでは、AndroidがonSaveInstanceState()
アクティビティを破棄する前に呼び出して、アプリケーションの状態に関するデータを保存できるようにします。onCreate()
その後、またはの間に状態を復元できますonRestoreInstanceState()
。アプリケーションがアプリケーションの状態を損なわずに再起動することをテストするには、アプリケーションでさまざまなタスクを実行しながら、構成の変更(画面の向きの変更など)を呼び出す必要があります。
onSaveInstanceState()
呼び出されたときに、Acitivity状態をオーバーライドして保存する必要があります。
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putString("textKey", mEditText.getText().toString());
}
そして、onCreate()
またはで状態を復元しますonRestoreInstanceState()
:
public void onCreate(Bundle savedInstanceState)
{
if(savedInstanceState != null)
{
mEditText.setText(savedInstanceState.getString("textKey"));
}
}
それでも不十分な場合はonRetainNonConfigurationInstance()
、再作成時に新しいアクティビティオブジェクトに渡されるカスタムオブジェクトをオーバーライドして返すことができます。使用方法の詳細については、ランタイム変更の処理を参照してください。ただし、この関数はAndroid 3.0以降では非推奨になっています(特にFragmentActivity
最終的な場合)。したがって、これをフラグメントと一緒に使用することはできません(これは問題ありません。構成の変更後もオブジェクトを保持するメカニズムがあります)。
そして最後のもの-決して使用しないでandroid:configChanges
ください。あなたはそれを使う非常に正当な理由を持っているに違いありません、そして通常これらはパフォーマンスの理由です。UI状態のリセットを防ぐためだけに、現在のように悪用されることを意図したものではありません。この属性を使用すると、はい、構成の変更時にアクティビティUIは再設定されませんが、後で破棄して再作成すると、アクティビティの状態はリセットされます。
ドキュメントはこのオプションをかなりよく説明しています:
注:構成の変更を自分で処理すると、システムが自動的にそれらを適用しないため、代替リソースの使用がはるかに困難になる可能性があります。この手法は最後の手段と見なす必要があり、ほとんどのアプリケーションには推奨されません