从保存的实例恢复片段时如何防止editText自动填充文本?

问题描述 投票:0回答:3

我有一个保存并显示多个片段的活动。

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

示例:

打开fragment并在两个editText中填写文本:
自定义编辑文本1:[______]
自定义编辑文本2:[_acb__]
CustomEditText3:[_qwe__]

单击后退按钮并重新输入片段
自定义编辑文本1:[_qwe__]
自定义编辑文本2:[_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. 为什么所有字段都填写相同的文本?
android android-fragments android-activity android-edittext android-savedstate
3个回答
38
投票

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

Android 中的 editTexts 上 SaveEnabled 默认为 true。


解决办法很简单,设置:

setSaveEnabled(false);

在你的editText上。

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


3
投票

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

正如@Slugge 评论的:
重写自定义 editText 中的 onSaveInstanceState 方法并清除文本/从那里执行您想要的操作。


0
投票

除了已接受的答案之外,我想强调的是,此设置

setSaveEnabled(false)
也可以通过布局完成。基本上是一样的,但是可以节省
.java
/
.kt
文件的空间:

<EditText
        ...
        android:saveEnabled="false"
        ... />
© www.soinside.com 2019 - 2024. All rights reserved.