AndroidのViewには、コンテナがデタッチされたときにステータスを保存する必要があるクラスがいくつかあります。Fragment.onViewCreated()は、View.onSaveInstanceState()の前に呼び出す必要があります。したがって、メソッドFragment.onViewCreated()に値を設定した場合。値は、メソッドView.onRestoreInstanceState(Parcelable state)でクリアする必要があります。
たとえば、TextView、RecyclerViewなどをクラス化します。TextView.javaのコードを読み取ることができます。
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
// Save state if we are forced to
final boolean freezesText = getFreezesText();
boolean hasSelection = false;
int start = -1;
int end = -1;
....
if (freezesText || hasSelection) {
SavedState ss = new SavedState(superState);
....
}
....
}
状態を保存するかどうかを制御するパラメータがあります:「freezesText」と「hasSelection」。TextViewを選択できないため、hasSelectionはfalseです。関数、getFreezesText()は、TextViewクラスでもfalseを返します。したがって、TextViewは状態を保存しません。EditText.javaのコード:
@Override
public boolean getFreezesText() {
return true;
}
EditTextはtrueを返すため、EditTextは状態を保存する必要があります。
このバグを修正する方法がいくつかあります。
1. EditText.getFreezesText()を実装してfalseを返し、EditTextでselectの状態をクリアします
2. EditTextのonSaveInstanceStateを実装し、nullを返します。次のようになります。
public Parcelable onSaveInstanceState() {
super.onSaveInstanceState();
return null;
}
3. EditText.setSaveEnable(false);を使用します。
4.xmlにパラメータを追加します"saveEnable='false'"