私のアプリにはTextView
とEditText
があります。両方にデータがあります。画面の向きが変わると、EditText
のデータは残りますが、TextView
データは消去されます。
誰かがTextView
にデータを保持する方法を見つけるのを手伝ってもらえますか?
TextView
にその状態を保存するように強制する場合は、 freezesText
属性を追加する必要があります。
<TextView
...
Android:freezesText="true" />
freezesText
のドキュメントから:
設定されている場合、テキストビューには、現在のカーソル位置などのメタデータに加えて、凍結されたつららの中に現在の完全なテキストが含まれます。デフォルトでは無効になっています。テキストビューのコンテンツがコンテンツプロバイダーなどの永続的な場所に保存されていない場合に役立ちます。
方向の変更でデータを保持するには、2つのメソッドを実装する必要があります。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Read values from the "savedInstanceState"-object and put them in your textview
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// Save the values you need from your textview into "outState"-object
super.onSaveInstanceState(outState);
}
Androidはそのようなものを処理しません。すべてのデータを手動で保存しました。
アクティビティで使用して値を保存できます
@Override
public Object onRetainNonConfigurationInstance() {
HashMap<String, Object> savedValues = new HashMap<String, Object>();
savedValues.put("someKey", someData);
return savedValues;
}
アクティビティのoncreateメソッドで次のようなものを使用して、保存されたオブジェクトをロードします
HashMap < String, Object> savedValues
= (HashMap<String, Object>)this.getLastNonConfigurationInstance();
アクティビティの方向の変更を無効にすることもできます
<activity Android:name=".Activity" Android:screenOrientation="portrait" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
</intent-filter>
</activity>
1)IDを持つすべてのビューが状態を保存するわけではありません。 Androidユーザーが状態を変更できるIDを持つウィジェットは、ソフトキルで状態を保存するように見えます。したがって、EditTextはその状態を保存しますが、TextViewはその状態を保存しませんソフトキル。
「AFAIK、Androidは、変更が予想されるものの状態を保存するだけです。そのため、ユーザーが変更する可能性のあるEditTextにテキストを保存します。 TextViewの状態(通常は静的なままです)」
マークM
したがって、onSaveInstanceStateでテキストビューの状態を保存することを選択でき、onCreateでテキストビューの状態を復元することを選択できます。
2)ベストプラクティスは、宣言した場合でも「内部」非ビューインスタンス状態を保存することです
Android:configChanges= "orientation|keyboardHidden"
ドキュメントから:
「ただし、アプリケーションは常に以前の状態をそのままシャットダウンして再起動できる必要があります。アプリケーションの再起動を防ぐことができない他の構成変更があるだけでなく、ユーザーが着信を受信したときなどのイベントを処理するためにも、電話してからアプリケーションに戻ります。」
JAL
AndroidManifest.xmlでアクティビティを変更して、アクティビティ/アクティビティにこれを追加することで、向きの変更動作をオーバーライドします。
Android:configChanges="orientation|keyboardHidden"
次のようになります。
<activity Android:name=".activity.LoginActivity"
Android:configChanges="orientation|keyboardHidden"
Android:label="@string/app_name">
</activity>
これらをAndroidManifest.xmlに追加します
Activity_Nameの代わりにアクティビティ名を入力します
<activity Android:name="Activity_Name"
Android:screenOrientation="sensor"
...
Android:configChanges="orientation|keyboardHidden|screenSize">
これは、TextFieldを変更する値でも機能します。
追加するだけ
Android:configChanges="orientation|screenSize"
androidManifest.xmlのアクティビティに追加します。