我有一个EditText
的片段,在onCreateView()
内我向TextWatcher
添加EditText
。
每次第二次添加片段afterTextChanged(Editable s)
都会调用回调而不会更改文本。
以下是代码段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
myEditText = (EditText) v.findViewById(R.id.edit_text);
myEditText.addTextChangedListener(textWatcher);
...
}
TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
searchProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
Log.d(TAG, "after text changed");
}
}
我还设置片段以保持其状态,并将片段的实例保留在活动中。
答案 0 :(得分:41)
已编辑的解决方案:
看起来文本从第二次附加片段时发生了变化,因为片段恢复了之前的视图状态。
我的解决方案是在text watcher
中添加onResume()
,因为在调用onResume
之前状态已恢复 。
@Override
public void onResume() {
super.onResume();
myEditText.addTextChangedListener(textWatcher);
}
修改强>
正如@MiloszTylenda在评论中提到的,最好删除Textwatcher
回调中的onPause()
以避免泄露Textwatcher
。
@Override public void onPause() {
super.onPause();
myEditText.removeTextChangedListener(watcher);
}
答案 1 :(得分:1)
该错误似乎来自以下事实:当视图再次变为活动状态以恢复EditText的状态时,Android SDK会调用settext。 从下面的摘录中可以看到,有一个标记可以更改Edittext以绕过此行为。
<!-- If false, no state will be saved for this view when it is being
frozen. The default is true, allowing the view to be saved
(however it also must have an ID assigned to it for its
state to be saved). Setting this to false only disables the
state for this view, not for its children which may still
be saved. -->
<attr name="saveEnabled" format="boolean" />
因此,通过在您的EditText上添加android:saveEnabled="false"
将解决此问题,并且当视图进入前景时,不会调用setText。
这就是我所做的,问题已解决。