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

标签 android android-edittext

我有一个带有 EditText 的 fragment ,在 onCreateView() 内我将 TextWatcher 添加到 EditText.

每次第二次添加 fragment 时,都会调用 afterTextChanged(Editable s) 回调,而不会更改文本。

这是一个代码 fragment :

@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");
    }
}

我还将 fragment 设置为保留其状态,并将 fragment 的实例保留在 Activity 中。

最佳答案

修改后的解决方案:

看起来文本在第二次附加 fragment 时发生了更改,因为 fragment 恢复了 View 的先前状态。

我的解决方案是在 onResume() 中添加 text watcher,因为状态已恢复 before onResume 被调用。

@Override
public void onResume() {
    super.onResume();
    myEditText.addTextChangedListener(textWatcher);
}

编辑 正如@MiloszTylenda 在评论中提到的,最好在 onPause() 回调中删除 Textwatcher 以避免泄漏 Textwatcher

@Override public void onPause() {
  super.onPause();
  myEditText.removeTextChangedListener(watcher);
}

关于android - 在没有实际更改文本的情况下调用 afterTextChanged() 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13721063/

相关文章:

java - 从文件中读取 unicode 并显示文本

android - 如何以编程方式设置一些 imeOptions

java - 在Android中的ListView上显示CSS样式的HTML数据

javascript - 移动浏览器是否支持使用 HTML5 视频标签的 4k 视频?

android - RecyclerView View 中的 EditText 在键盘打开时分离

java - Android java 两个用于编辑文本的监听器

android - 用于显示文本选择句柄的 EditText 的自定义剪切/复制操作栏

android - 如何限制 EditText 使用表情符号

java - 如何使用 LinearLayout 使两个图像位于两端?

Android Application Init 和全局对象