【问题标题】:How to prevent editText from auto filling text when fragment is restored from saved instance?从保存的实例恢复片段时,如何防止editText自动填充文本?
【发布时间】:2017-08-29 17:46:59
【问题描述】:

我有一个包含并显示多个片段的活动。

当我重新输入片段时,它会自动填充所有编辑文本中的文本。所有字段的文本也相同。

例子:

打开片段,在两个editText中填入文字:
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 是我的自定义视图)

两个问题/问题:

  1. 如何防止activity/fragment/editText在fragment恢复时填写字段中的文本?
  2. 为什么要为所有字段填写相同的文本?

【问题讨论】:

  • 可能您在某处恢复了已保存的状态。显示您的片段的代码
  • @SergeyGlotov 看代码。我没有恢复任何东西。 Android 会自动为添加到 backstack afaik 的片段保存 editTexts 的状态...
  • @SergeyGlotov Android 单独恢复 EditText 的状态,解决这个问题的一个 hacky 方法是继承 EditText 并覆盖 onRestoreSavedState 方法,在那里使用 setText("")。但同样,这是一个 hacky 解决方案
  • @Slugge 你为什么称其为 hacky 解决方案?
  • @peter 因为让它首先设置文本然后再次设置它以重置它是两个不必要的操作,最好防止状态保存。或者改变保存状态

标签: android android-fragments android-activity android-edittext android-savedstate


【解决方案1】:

这不是答案,但它解决了问题:

正如@Slugge 评论的那样:
覆盖自定义 editText 中的 onSaveInstanceState 方法并清除文本/从那里做你想做的事。

【讨论】:

    【解决方案2】:

    在朋友的帮助下发现了问题!

    SaveEnabled 在 Android 中的 editTexts 上默认为 true。


    解决方法就是设置:
    setSaveEnabled(false);
    在你的editText上。

    事实证明,Android 在如何为同一层次结构中具有相同 ID 的视图(即使在具有不同 ID 的父视图中)恢复状态方面并不是很聪明。我刚刚将其关闭,因为我将状态保存在 ViewModel 对象中并从片段的 onCreateView() 中恢复它。

    【讨论】:

    • 在 Xamarin 中遇到了这个问题,我花了很长时间才弄清楚发生了什么,因为我的调用堆栈毫无价值。非常感谢您的回答!
    • “此链接说明了如何让它正确执行”:链接已失效,我想在不使用 ViewModel 的情况下正确处理它,请帮忙?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多