19

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

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

例子:

打开片段,在两个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. 当片段恢复时,如何防止活动/片段/编辑文本填写字段中的文本?
  2. 为什么要为所有字段填写相同的文本?
4

2 回答 2

34

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

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


解决方案是简单地设置:
setSaveEnabled(false);
在你的editText上。

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

于 2017-04-05T06:56:08.310 回答
3

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

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

于 2017-04-04T13:53:13.653 回答