如何在TextChangedListener中获取EditText的父视图? 我想在文本发生变化时获取其父视图的标记。
由于Button.OnClick()直接将View作为参数,我们可以使用getParent(),如何使用EditText做类似的事情?
编辑:我需要避免进行全局引用。很高兴知道是否还有其他事件或方法可以做到这一点。
答案 0 :(得分:3)
如果您设置一个实例变量来引用该视图,您将能够在整个课程中访问它。
首先将EditText
变量定义为类
private EditText mEditText;
然后在某些地方,例如onCreate
或onViewCreated
,您可以初始化EditText
并添加听众。
mEditText = (EditText)findViewById(R.id.edit_text);
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Get the parent view of the edit text here
View parentView = mEditText.getParent();
}
});
现在,您可以在任意位置使用mEditText
变量,如上所示。
如果您不想在片段或活动中创建像mEditText
这样的实例变量,您可以创建自己的抽象类,以实现TextWatcher
作为替代解决方案。
public abstract class MyTextWatcher implements TextWatcher{
private EditText editText;
public MyTextWatcher(EditText editText) {
this.editText = editText;
}
public EditText getEditTextView() {
return editText;
}
public ViewParent getParentView() {
return editText.getParent();
}
public View getRootView() {
return editText.getRootView();
}
}
这样您就可以向EditText
提供TextWatcher
,以便在该范围内访问 mEditText = (EditText)findViewById(R.id.edit_text);
// Create a new instance of the MyTextWatcher class and pass it your EditText
mEditText.addTextChangedListener(new MyTextWatcher(mEditText) {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
// Get the view parent here
ViewParent viewParent = getParentView();
}
});
。
MyTextWatcher
现在,您可以从片段或活动中实现的每个回调方法访问添加到colorControlActivated
类的任何方法。
答案 1 :(得分:1)
我现在在EditText上使用了OnFocusChangeListener。它提供View作为参数就像OnClick。
new OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus)
{
//TODO
}
}
唯一的缺点是事件会在更改焦点时触发,而不是在EditText中的每次击键时触发。