Edittext の特別な点は、値を保持できますが、Textview やその他のウィジェットでは保持できないため、onSavedInstance() メソッドを使用する必要があることです。
値を保持できる EditText の背後にある魔法は何ですか?
誰かがそれが内部でどのように機能するかを知ることができれば。
<----更新---->
内部でどのように機能するか、このシナリオを説明しているコードの部分を示してください。
Edittext の特別な点は、値を保持できますが、Textview やその他のウィジェットでは保持できないため、onSavedInstance() メソッドを使用する必要があることです。
値を保持できる EditText の背後にある魔法は何ですか?
誰かがそれが内部でどのように機能するかを知ることができれば。
<----更新---->
内部でどのように機能するか、このシナリオを説明しているコードの部分を示してください。
値を保持できる EditText の背後にある魔法は何ですか? 内部でどのように機能するか、このシナリオを説明しているコードの部分を示してください。
違いをもたらすのは、選択可能なプロパティです。TextView.onSaveInstanceStateの次のif
条件がそれを処理します。
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
// Save state if we are forced to
boolean save = mFreezesText;
int start = 0;
int end = 0;
if (mText != null) {
start = getSelectionStart();
end = getSelectionEnd();
if (start >= 0 || end >= 0) {
// Or save state if there is a selection
save = true;
}
}
...
}
デフォルトTextView
では選択できません。したがってgetSelectionStart()
とgetSelectionEnd()
が返さ-1
れ、そこでsave
変数は偽の値を保持します。向きが変わってもコンテンツを保持するには、属性textIsSelectableを true に設定します。
EditText
はデフォルトで選択可能でgetSelectionStart()
あり、getSelectionEnd()
常に値 >=0 を返すため、変数によって真save
の値が保持され、コンテンツが保存されます。
注 : デフォルトでは、 freezesTextは無効になっています。したがってmFreezesText
、値は false です。
デフォルトでは、EditText ビューはその状態を保存します。これは、ビューが表示されていない場合やフォーカスが失われた場合に状態を保存するようにビューに指示するコードでフラグを設定することによって実現されます。テキストは自動的に保存され、デバイスを回転させた後に復元されます。android:saveEnabled プロパティを false に設定することにより、XML レイアウト ファイルで EditText ビューの状態の自動保存を無効にすることができます。
android:saveEnabled="false"
またはプログラムで、 を呼び出しますview.setSaveEnabled(false)
。
saveEnabled は、このビューの状態の保存を有効にするかどうか (つまり、その onSaveInstanceState() メソッドを呼び出すかどうか) を制御します。フリーズが有効になっている場合でも、状態を保存するには、(setId() を介して) ビューに ID を割り当てる必要があることに注意してください。このフラグは、このビューの保存のみを無効にできます。子ビューには状態が保存されている場合があります。saveEnabled 属性は Android View - View Codeの一部です。コードの関連部分は次のとおりです。
public boolean isSaveEnabled() {
return (mViewFlags & SAVE_DISABLED_MASK) != SAVE_DISABLED;
}
...
public void setSaveEnabled(boolean enabled) {
setFlags(enabled ? 0 : SAVE_DISABLED, SAVE_DISABLED_MASK);
}
...
void setFlags(int flags, int mask) {
int old = mViewFlags;
mViewFlags = (mViewFlags & ~mask) | (flags & mask);
int changed = mViewFlags ^ old;
if (changed == 0) {
return;
}
int privateFlags = mPrivateFlags;
/* Check if the FOCUSABLE bit has changed */
if (((changed & FOCUSABLE_MASK) != 0) &&
((privateFlags & HAS_BOUNDS) !=0)) {
if (((old & FOCUSABLE_MASK) == FOCUSABLE)
&& ((privateFlags & FOCUSED) != 0)) {
/* Give up focus if we are no longer focusable */
clearFocus();
} else if (((old & FOCUSABLE_MASK) == NOT_FOCUSABLE)
&& ((privateFlags & FOCUSED) == 0)) {
/*
* Tell the view system that we are now available to take focus
* if no one else already has it.
*/
if (mParent != null) mParent.focusableViewAvailable(this);
}
}
....
この記事からの引用: https://tekeye.uk/android/examples/saving-activity-state
「デバイスを縦向きから横向きに切り替えると、Android はアクティビティを停止して再起動し、さまざまなサイズの画面を再描画する機会をアクティビティに与えます。アクティビティを停止して開始すると、入力が失われ続けると、ユーザーはよく発生します。Android Activites には、データを保存するために入力ビューによって自動的に使用される onSaveInstanceState(Bundle) および onRestoreInstanceState(Bundle) というメソッドのペアがあります. これらのメソッドは、データを取得するビューが識別できる場合にのみ機能するため、EditText (および入力フィールドに関連付けられていない状態変数も保存および復元できるように、このメソッドのペアをアクティビティでオーバーライドできるという利点があります。
edittext から ID を削除して試してみてください :)
テキストビューでこれを試してみてください
<TextView
...
android:freezesText="true" />