Android: 在 TextChangedListener 中获取 EditText 的父视图
Android: Get Parent View of EditText in TextChangedListener
如何在 TextChangedListener 中获取 EditText 的父视图?
我想在文本更改时获取其父视图的标签。
由于Button.OnClick()直接将View作为参数,我们可以使用getParent(),如何使用EditText做类似的事情?
编辑:我需要避免进行全局引用。最好知道是否有任何其他事件或方法可以做到这一点。
方法一:创建实例变量
如果您设置一个实例变量来引用视图,您将能够在整个 class 中访问它。
首先在你的class
中将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
变量,如上所示。
方法二:不用实例变量求解
如果您不想在您的片段或 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 中的每次击键时触发。
如何在 TextChangedListener 中获取 EditText 的父视图? 我想在文本更改时获取其父视图的标签。
由于Button.OnClick()直接将View作为参数,我们可以使用getParent(),如何使用EditText做类似的事情?
编辑:我需要避免进行全局引用。最好知道是否有任何其他事件或方法可以做到这一点。
方法一:创建实例变量
如果您设置一个实例变量来引用视图,您将能够在整个 class 中访问它。
首先在你的class
中将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
变量,如上所示。
方法二:不用实例变量求解
如果您不想在您的片段或 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 中的每次击键时触发。