Android:在TextChangedListener中获取EditText的父视图

时间:2015-06-30 16:38:17

标签: android android-edittext

如何在TextChangedListener中获取EditText的父视图? 我想在文本发生变化时获取其父视图的标记。

由于Button.OnClick()直接将View作为参数,我们可以使用getParent(),如何使用EditText做类似的事情?

编辑:我需要避免进行全局引用。很高兴知道是否还有其他事件或方法可以做到这一点。

2 个答案:

答案 0 :(得分:3)

方法1:创建实例变量

如果您设置一个实例变量来引用该视图,您将能够在整个课程中访问它。

首先将EditText变量定义为类

中的实例变量
private EditText mEditText; 

然后在某些地方,例如onCreateonViewCreated,您可以初始化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变量,如上所示。

方法2:无实例变量解决

如果您不想在片段或活动中创建像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中的每次击键时触发。