在没有实际更改文本的情况下调用afterTextChanged()回调

时间:2012-12-05 10:27:54

标签: android android-edittext

我有一个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");
    }
}

我还设置片段以保持其状态,并将片段的实例保留在活动中。

2 个答案:

答案 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。

这就是我所做的,问题已解决。