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

问题描述 投票:17回答:1

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

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

android android-edittext
1个回答
43
投票

编辑解决方案:

因为看起来文本是从第二次附加片段而改变的,因为片段恢复了先前的视图状态。

我的解决方案是在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);
}
© www.soinside.com 2019 - 2024. All rights reserved.