从保存的实例恢复片段时如何防止 editText 自动填充文本?
How to prevent editText from auto filling text when fragment is restored from saved instance?
我有一个 activity 可以保存和显示多个片段。
当我重新输入片段时,它会自动填充所有编辑文本中的文本。所有字段的文本也是相同的。
示例:
打开片段并在两个editTexts中填写文本:
CustomEditText1: [______]
CustomEditText2:[_acb__]
CustomEditText3:[_qwe__]
单击后退按钮并重新输入片段
CustomEditText1: [_qwe__]
CustomEditText2:[_qwe__]
CustomEditText3:[_qwe__]
这是我在片段中覆盖的方法:
public AddBookingFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
tabsActivity = (TabsActivity) getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_booking, container, false);
lastNameEditText = (NASEditText) view.findViewById(R.id.nas_add_booking_last_name);
pnrEditText = (NASEditText) view.findViewById(R.id.nas_add_booking_pnr);
addButton = (NASButton) view.findViewById(R.id.nas_add_booking_add_button);
scanButton = (NASButton) view.findViewById(R.id.nas_add_booking_scan_button);
confirmationBox = (LinearLayout) view.findViewById(R.id.nas_add_booking_confirmation_box);
confirmationText = (NASHeaderAndSubtext) view.findViewById(R.id.nas_add_booking_confirmation_text);
confirmationBox.setVisibility(View.GONE);
bindButtons();
FontHelper.setFont(container, tabsActivity);
return view;
}
通过调试,我可以看到 editText 正在通过在覆盖的 OnTextChanged 内部设置断点来设置文本。
这是该断点的堆栈跟踪:
(NASEditText 是我的自定义视图)
两个问题/疑问:
- 如何防止 activity/fragment/editText 在恢复片段时填写字段中的文本?
- 为什么所有字段都填写相同的文本?
这不是答案,但它解决了问题:
@Slugge 评论:
覆盖自定义 editText 中的 onSaveInstanceState 方法并清除文本/从那里做你想做的事。
在朋友的帮助下发现了问题!
Android 中的 editTexts 的 SaveEnabled 默认为 true。
解决方法很简单,设置:
setSaveEnabled(false);
在你的 editText 上。
事实证明,Android 在为同一层次结构中具有相同 ID 的视图(即使在具有不同 ID 的父视图中)恢复状态方面并不是很聪明。我刚刚关闭它,因为我将我的状态保存在 ViewModel 对象中并从片段的 onCreateView() 中恢复它。
我有一个 activity 可以保存和显示多个片段。
当我重新输入片段时,它会自动填充所有编辑文本中的文本。所有字段的文本也是相同的。
示例:
打开片段并在两个editTexts中填写文本:
CustomEditText1: [______]
CustomEditText2:[_acb__]
CustomEditText3:[_qwe__]
单击后退按钮并重新输入片段
CustomEditText1: [_qwe__]
CustomEditText2:[_qwe__]
CustomEditText3:[_qwe__]
这是我在片段中覆盖的方法:
public AddBookingFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
tabsActivity = (TabsActivity) getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_booking, container, false);
lastNameEditText = (NASEditText) view.findViewById(R.id.nas_add_booking_last_name);
pnrEditText = (NASEditText) view.findViewById(R.id.nas_add_booking_pnr);
addButton = (NASButton) view.findViewById(R.id.nas_add_booking_add_button);
scanButton = (NASButton) view.findViewById(R.id.nas_add_booking_scan_button);
confirmationBox = (LinearLayout) view.findViewById(R.id.nas_add_booking_confirmation_box);
confirmationText = (NASHeaderAndSubtext) view.findViewById(R.id.nas_add_booking_confirmation_text);
confirmationBox.setVisibility(View.GONE);
bindButtons();
FontHelper.setFont(container, tabsActivity);
return view;
}
通过调试,我可以看到 editText 正在通过在覆盖的 OnTextChanged 内部设置断点来设置文本。
这是该断点的堆栈跟踪:
(NASEditText 是我的自定义视图)
两个问题/疑问:
- 如何防止 activity/fragment/editText 在恢复片段时填写字段中的文本?
- 为什么所有字段都填写相同的文本?
这不是答案,但它解决了问题:
@Slugge 评论:
覆盖自定义 editText 中的 onSaveInstanceState 方法并清除文本/从那里做你想做的事。
在朋友的帮助下发现了问题!
Android 中的 editTexts 的 SaveEnabled 默认为 true。
解决方法很简单,设置:
setSaveEnabled(false);
在你的 editText 上。
事实证明,Android 在为同一层次结构中具有相同 ID 的视图(即使在具有不同 ID 的父视图中)恢复状态方面并不是很聪明。我刚刚关闭它,因为我将我的状态保存在 ViewModel 对象中并从片段的 onCreateView() 中恢复它。