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

Android: Get Parent View of EditText in TextChangedListener

如何在 TextChangedListener 中获取 EditText 的父视图? 我想在文本更改时获取其父视图的标签。

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

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

方法一:创建实例变量

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

首先在你的class

中将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 变量,如上所示。

方法二:不用实例变量求解

如果您不想在您的片段或 activity 中创建像 mEditText 这样的实例变量,您可以创建自己的抽象 class 实现 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 class 的任何方法现在都可以从您在片段或 activity 中实现的每个回调方法访问。

我现在在 EditText 上使用 OnFocusChangeListener。它像OnClick一样提供View作为参数。

new OnFocusChangeListener() 
{
    @Override
    public void onFocusChange(View v, boolean hasFocus)
    {
        //TODO
    }
}

唯一的缺点是该事件会在更改焦点时触发,而不是在 EditText 中的每次击键时触发。