我有一个带有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");
}
}
我还设置片段以保持其状态,并将片段的实例保留在活动中。
编辑解决方案:
因为看起来文本是从第二次附加片段而改变的,因为片段恢复了先前的视图状态。
我的解决方案是在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);
}