Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在TextChangedListener中获取EditText的父视图_Android_Android Edittext - Fatal编程技术网

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

Android:在TextChangedListener中获取EditText的父视图,android,android-edittext,Android,Android Edittext,如何在TextChangedListener中获取EditText的父视图? 我想在文本更改时获取其父视图的标记 由于Button.OnClick将视图直接作为参数,我们可以使用getParent,如何使用EditText执行类似操作 编辑:我需要避免全局引用。最好知道是否有其他事件或方法可以执行此操作。方法1:创建实例变量 如果将实例变量设置为引用视图,则可以在整个类中访问它 首先将EditText变量定义为类中的实例变量 private EditText mEditText; 然后在某些

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

由于Button.OnClick将视图直接作为参数,我们可以使用getParent,如何使用EditText执行类似操作

编辑:我需要避免全局引用。最好知道是否有其他事件或方法可以执行此操作。

方法1:创建实例变量 如果将实例变量设置为引用视图,则可以在整个类中访问它

首先将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变量,如上图所示

方法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();
    }
}
这将允许您向TextWatcher提供EditText,以便可以在该范围内访问它

    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类中的任何方法现在都可以从您在片段或活动中实现的每个回调方法中访问

方法1:创建一个实例变量 如果将实例变量设置为引用视图,则可以在整个类中访问它

首先将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变量,如上图所示

方法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();
    }
}
这将允许您向TextWatcher提供EditText,以便可以在该范围内访问它

    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类中的任何方法现在都可以从您在片段或活动中实现的每个回调方法中访问

我现在在EditText上使用了OnFocusChangeListener。它提供视图作为参数,就像OnClick一样

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

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

我现在在EditText上使用了OnFocusChangeListener。它提供视图作为参数,就像OnClick一样

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

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

我有这个想法,但我需要避免全局引用。编辑了这个问题。无论如何,谢谢。我已经编辑了我的答案,以包含一个不使用实例变量的替代解决方案。MyTextWatcher的新实例中的参数是否应该是mEditText而不是editText?另外,是否有方法访问当前的editText视图而不是其父视图?它应该是mEditText,我已经编辑了我的答案。只需调用getEditTextView即可获取当前的EditText。我在MyTextWatcher类中定义了这个方法作为例子。我有这个想法,但我需要避免全局引用。编辑了这个问题。无论如何,谢谢。我已经编辑了我的答案,以包含一个不使用实例变量的替代解决方案。MyTextWatcher的新实例中的参数是否应该是mEditText而不是editText?另外,是否有方法访问当前的editText视图而不是其父视图?它应该是mEditText,我已经编辑了我的答案。只需调用getEditTextView即可获取当前的EditText。我在MyTextWatcher类中定义了该方法作为示例。