更改监听器上的 android 编辑文本

我对 TextWatcher略知一二,但它会触发你输入的每个字符。我想要一个侦听器,每当用户完成编辑时触发。有可能吗?同样在 TextWatcher中我得到一个 Editable的实例,但是我需要一个 EditText的实例。我怎么才能拿到?

编辑 : 第二个问题更重要,请回答。

286813 次浏览

在我看来,只有两种方法可以做到。你怎么知道用户已经写完了一个单词?要么在焦点丢失,或点击一个“确定”按钮。在我看来,你不可能知道用户按下了最后一个字符..。

因此,调用 onFocusChange(View v, boolean hasFocus)或添加一个按钮和一个单击监听器。

首先,如果 EditText失去焦点或者用户按下 done 按钮(这取决于您的实现和最适合您的方式) ,您可以看到用户是否完成了文本编辑。 其次,只有将 EditText声明为实例对象时,才能在 TextWatcher中获得 EditText实例。即使您不应该编辑 TextWatcher内的 EditText,因为它是不安全的。

编辑:

为了能够将 EditText实例导入到 TextWatcher实现中,您应该尝试这样的操作:

public class YourClass extends Activity {


private EditText yourEditText;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


setContentView(R.layout.main);
yourEditText = (EditText) findViewById(R.id.yourEditTextId);


yourEditText.addTextChangedListener(new TextWatcher() {


public void afterTextChanged(Editable s) {


// you can call or do what you want with your EditText here


// yourEditText...
}


public void beforeTextChanged(CharSequence s, int start, int count, int after) {}


public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
}
}

请注意,上面的示例可能有一些错误,但我只是想向您展示一个示例。

TextWatcher对我来说不起作用,因为它一直在为每个 EditText开火,并且互相搞乱了对方的值。

我的解决办法是:

public class ConsultantTSView extends Activity {
.....


//Submit is called when I push submit button.
//I wanted to retrieve all EditText(tsHours) values in my HoursList


public void submit(View view){


ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
}
}

因此,通过使用 getChildAt(xx)方法,您可以检索 ListView中的任何项目,并使用 findViewById获取单独的项目。然后它会给出最新的价值。

我已经用 AutotextView做到了:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {


@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
seq = cs;
}


@Override
public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {


}


@Override
public void afterTextChanged(Editable arg0) {
new SearchTask().execute(seq.toString().trim());
}


});

任何使用 蝴蝶刀的人都可以使用如下命令:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {


}

为我的所有 EditText 字段实现一个侦听器需要有丑陋的、冗长的代码,这让我感到困扰,因此我编写了下面的类。可能对任何偶然发现的人都有用。

public abstract class TextChangedListener<T> implements TextWatcher {
private T target;


public TextChangedListener(T target) {
this.target = target;
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}


@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}


@Override
public void afterTextChanged(Editable s) {
this.onTextChanged(target, s);
}


public abstract void onTextChanged(T target, Editable s);
}

现在实现一个侦听器有点简单了。

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
@Override
public void onTextChanged(EditText target, Editable s) {
//Do stuff
}
});

至于触发的频率,可以实现一个检查,在给定的

 myTextBox.addTextChangedListener(new TextWatcher() {


    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) {


TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);
myOutputBox.setText(s);


}
});

Watcher 方法触发每个字符输入。 因此,我基于 onFocusChange 方法构建了这段代码:

public static boolean comS(String s1,String s2){
if (s1.length()==s2.length()){
int l=s1.length();
for (int i=0;i<l;i++){
if (s1.charAt(i)!=s2.charAt(i))return false;
}
return true;
}
return false;
}


public void onChange(final EditText EdTe, final Runnable FRun){
class finalS{String s="";}
final finalS dat=new finalS();
EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {dat.s=""+EdTe.getText();}
else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}
}
});
}

要使用它,只需这样调用:

onChange(YourEditText, new Runnable(){public void run(){
// V  V    YOUR WORK HERE


}}
);

您可以通过替换!+ EdTe.getText ()) !等功能。然而,相等的函数本身有时在运行时不能正常工作。

OnChange 侦听器将在用户输入焦点时记住 EditText 的旧数据,然后在用户失去焦点或跳转到其他输入时比较新数据。如果比较旧的 String 而不是新的 String,它将触发工作。

如果您只有1个 EditText,那么您将需要通过在窗口外创建一个 Ultimate Secret Transparency Micro EditText 来创建一个 ClearFocus 函数,并请求对其进行聚焦,然后通过 Import Method Manager 隐藏键盘。

在 Kotlin Android,EditText 监听器设置为,

   val searchTo : EditText = findViewById(R.id.searchTo)
searchTo.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable) {


// you can call or do what you want with your EditText here


// yourEditText...
}


override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
})

我已经从@RNGuy 那里得到了解决方案,谢谢! 并稍微更改了侦听器,所以现在它只接受通过更新 textView 的整数。

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;


public abstract class NumberChangedListener implements TextWatcher {
private final EditText target;
private final String defaultValue;


public NumberChangedListener(EditText target, int defaultValue) {
this.target = target;
this.defaultValue = defaultValue + "";
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}


@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}


@Override
public void afterTextChanged(Editable s) {
this.onTextChanged(target, s);
}


private void onTextChanged(EditText target, Editable s) {
String input = s.toString();
String number = input.replaceAll("[^\\d]", "");


if (!number.equals(input)) {
target.setText(number);
return;
}


Integer integer;


try {
integer = Integer.valueOf(number);
} catch (NumberFormatException ignored) {
target.setText(defaultValue);
return;
}


if (!integer.toString().equals(number)) {
target.setText(integer.toString());
return;
}


onNumberChanged(integer);


}


public abstract void onNumberChanged(int value);
}

用作

    int defaultVal = 10;
mTextView.addTextChangedListener(new NumberChangedListener(mTextView, defaultVal) {
@Override
public void onNumberChanged(int value) {
// use the parsed int
}
});