7

EditTextとimageviewとボタンを使った小さなアクティビティがあります。ボタンを押すと結果を得るためにカメラが起動し、戻ると画像ビューが今撮った写真に変わります。

ただし、向きが変わると、imageviewはレイアウトのデフォルトにリセットされます。

私が試したのは、カスタムと呼ばれるブール値を設定することでした。写真を撮ると、それがtrueに設定されます。onConfigurationChanged()をオーバーライドし、customがtrueに設定されている場合は、イメージを復元します。

私の問題は、EditTextが消去されることです-構成変更後にEditTextを復元するにはどうすればよいですか?私の最初の試みは、そのコンテンツをString onPause()に保存してから復元することでしたが、常に空白になります。

4

2 に答える 2

16

通常、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は再設定されませんが、後で破棄して再作成すると、アクティビティの状態はリセットされます。

ドキュメントはこのオプションをかなりよく説明しています:

注:構成の変更を自分で処理すると、システムが自動的にそれらを適用しないため、代替リソースの使用がはるかに困難になる可能性があります。この手法は最後の手段と見なす必要があり、ほとんどのアプリケーションには推奨されません

于 2011-08-17T07:21:27.810 に答える
6

android:configChanges="orientation"マニフェストのアクティビティ行に追加することで、方向が変更された後にアクティビティを強制的にリロードしないようにすることができます。

于 2011-08-17T06:49:33.217 に答える