6

私はEditTextとイメージビューとボタンで小さなアクティビティを持っています。ボタンを押すと、結果のためにカメラが起動し、戻ってきたら、直前の画像に画像ビューが変わります。オリエンテーション変更で私のビューがリセットされています

しかし、向きが変わると、イメージビューはレイアウト上のデフォルトの表示に戻ります。

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

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

答えて

14

通常、UIビューが状態を保持していない場合、最初にチェックするのは、このUIビューにIDが割り当てられていることです。このIDなしでは、ビューは状態を復元できません。


これが解決しない場合は

<EditText android:id="@+id/text" ... /> 

は、あなた自身を保存し、状態を復元する必要があります。 Handling Runtime Changesをご覧ください。それはかなりあなたが何をすべきかについて説明します。

適切に再起動を処理するには、あなたの活動が通常の活動のライフサイクルを通じて、以前の状態に復元することが重要であるあなたがなるように、それはあなたの活動を破壊する前に、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()をオーバーライドして、すべてのカスタムオブジェクトを返すことができます新しいアクティビティオブジェクトに再作成されたときにssedされます。それを使用する方法の詳細は、Handling Runtime Changesにあります。しかし、この関数はAndroid 3.0以降では推奨されていません(具体的にはFragmentActivity)。ですから、これはフラグメントと一緒に使うことはできません(これはうまくいきますが、構成変更全体でオブジェクトを保持するメカニズムがあります)。


最終的にはandroid:configChangesを使用しないでください。それを使用するのは非常に良い理由が必要です。通常、これはパフォーマンスの理由です。 UIの状態のリセットを防ぐために、今のように悪用されることはありませんでした。この属性が使用されている場合はyes、アクティビティUIはコンフィグレーションの変更時に再設定されませんが、後で破棄され再作成されるとアクティビティ状態はリセットされます。

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

注:システムはあなたのためにそれらを 自動的に適用されないため、自分自身を変更するコンフィギュレーションを取り扱い、代替リソースを使用する は難しい、それははるかにすることができます。 この技術は は最後の手段と考えるべきであると、ほとんどのアプリケーション

+0

これははるかに良いアプローチのように聞こえるので、私はビットマップの代わりにこれを使用することができますし、edittextは問題にはなりません。しかし、イメージの状態を保存するためにはどの関数を使用しますか? – Sebastian

+0

ビットマップがディスクに保存されている場合、 'onSaveInstanceState()'関数でビットマップへのパスを保存するだけです。ビットマップがメモリにある場合は、 'onRetainNonConfigurationInstance()'を使うことができます。 – inazaruk

4

マニフェストのアクティビティラインにandroid:configChanges="orientation"を追加すると、オリエンテーションを変更した後にリロードしないように強制できます。

+0

にはお勧めしません。しかし、それは活動が横向きにされている電話機に調整しないことはないだろうか? – Sebastian

+0

これは正解です。画面が向きを変えるのを防ぐのは 'android:screenOrientation =" portrait "' –

+4

ですが、これはこの特定のケースを修正しますが、基本的な問題を修正するものではありません。そして 'android:configChanges'は最後の手段と考えられ、通常は使用されるべきではありません。 http://developer.android.com/guide/topics/resources/runtime-changes.html – inazaruk

関連する問題