Vik*_*dar 65 android interface textwatcher android-edittext android-activity
我想TextWatcher为多个EditText字段实现接口.目前我正在使用:
text1.addTextChangedListener(this);
text2.addTextChangedListener(this);
Run Code Online (Sandbox Code Playgroud)
然后重写我的Activity中的方法:
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count)
{
// do some operation on text of text1 field
// do some operation on text of text2 field
}
Run Code Online (Sandbox Code Playgroud)
然而,这工作正常但我正在寻找其他方法,以便我可以明确地确定当前关注的EditText字段SoftKeyboard.
Bob*_*obs 89
在建议的解决方案@Sebastian罗斯的回答是没有的一个实例TextWatcher一些EditTexts.对于n,它是该类的一个类和n个实例EditTexts.
每个EditText都有自己的Spannable.TextWatcher的事件将此Spannable作为s参数.我检查他们的hashCode(每个对象的唯一ID).myEditText1.getText()返回Spannable.所以,如果myEditText1.getText().hashCode()等于s.hashCode()它意味着s属于myEditText1
因此,如果你想要TextWatcher一些实例,EditTexts你应该使用这个:
private TextWatcher generalTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (myEditText1.getText().hashCode() == s.hashCode())
{
myEditText1_onTextChanged(s, start, before, count);
}
else if (myEditText2.getText().hashCode() == s.hashCode())
{
myEditText2_onTextChanged(s, start, before, count);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
if (myEditText1.getText().hashCode() == s.hashCode())
{
myEditText1_beforeTextChanged(s, start, count, after);
}
else if (myEditText2.getText().hashCode() == s.hashCode())
{
myEditText2_beforeTextChanged(s, start, count, after);
}
}
@Override
public void afterTextChanged(Editable s) {
if (myEditText1.getText().hashCode() == s.hashCode())
{
myEditText1_afterTextChanged(s);
}
else if (myEditText2.getText().hashCode() == s.hashCode())
{
myEditText2_afterTextChanged(s);
}
}
};
Run Code Online (Sandbox Code Playgroud)
和
myEditText1.addTextChangedListener(generalTextWatcher);
myEditText2.addTextChangedListener(generalTextWatcher);
Run Code Online (Sandbox Code Playgroud)
Seb*_*oth 83
我会这样做:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText e = new EditText(this);
e.addTextChangedListener(new CustomTextWatcher(e));
}
private class CustomTextWatcher implements TextWatcher {
private EditText mEditText;
public CustomTextWatcher(EditText e) {
mEditText = e;
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void afterTextChanged(Editable s) {
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
使用"CustomTextWatcher"的想法,我做到了
1)创建一个新的TextWatcherListener接口:
public interface TextWatcherExtendedListener extends NoCopySpan
{
public void afterTextChanged(View v, Editable s);
public void onTextChanged(View v, CharSequence s, int start, int before, int count);
public void beforeTextChanged(View v, CharSequence s, int start, int count, int after);
}
Run Code Online (Sandbox Code Playgroud)
2)创建并使用EditTextExtended而不是EditText(在我的例子中):
public class EditTextExtended extends EditText
{
private TextWatcherExtendedListener mListeners = null;
public EditTextExtended(Context context)
{
super(context);
}
public EditTextExtended(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public EditTextExtended(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void addTextChangedListener(TextWatcherExtendedListener watcher)
{
if (mListeners == null)
{
mListeners = watcher;
}
}
public void removeTextChangedListener(TextWatcherExtendedListener watcher)
{
if (mListeners != null)
{
mListeners = null;
}
}
void sendBeforeTextChanged(CharSequence text, int start, int before, int after)
{
if (mListeners != null)
{
mListeners.beforeTextChanged(this, text, start, before, after);
}
}
void sendOnTextChanged(CharSequence text, int start, int before,int after)
{
if (mListeners != null)
{
mListeners.onTextChanged(this, text, start, before, after);
}
}
void sendAfterTextChanged(Editable text)
{
if (mListeners != null)
{
mListeners.afterTextChanged(this, text);
}
}
}
Run Code Online (Sandbox Code Playgroud)
3)所以,你需要写下这段代码:
myEditTextExtended.addTextChangedListener(this) //Let implement TextWatcherExtendedListener methods
Run Code Online (Sandbox Code Playgroud)
4)使用它们:
@Override
public void onTextChanged(View v, CharSequence s, int start, int before, int count)
{
//Tested and works
//do your stuff
}
@Override
public void beforeTextChanged(View v, CharSequence s, int start, int count, int after)
{
//not yet tested but it should work
}
@Override
public void afterTextChanged(View v, Editable s)
{
//not yet tested but it should work
}
Run Code Online (Sandbox Code Playgroud)
好吧,让我知道你的想法.
Tom*_*asz 11
- 编辑 -
如果您只想使用afterTextChanged比较editables:
@Override
public void afterTextChanged(Editable editable) {
if (editable == mEditText1.getEditableText()) {
// DO STH
} else if (editable == mEditText2.getEditableText()) {
// DO STH
}
}
Run Code Online (Sandbox Code Playgroud)
我使用这个解决方案:
添加返回侦听器的方法:
private TextWatcher getTextWatcher(final EditText editText) {
return new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
// do what you want with your EditText
editText.setText("blabla");
}
@Override
public void afterTextChanged(Editable editable) {
}
};
}
Run Code Online (Sandbox Code Playgroud)将监听器添加到多个EditText,您还可以传递其他参数:
editText1.addTextChangedListener(getTextWatcher(editText1));
editText2.addTextChangedListener(getTextWatcher(editText2));
editText3.addTextChangedListener(getTextWatcher(editText3));
Run Code Online (Sandbox Code Playgroud)