我的android代码中有一个EditText,我想在用户停止编辑字段后显示Toast消息。
final EditText kurz = findViewById(R.id.kurz);
kurz.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) { Toast.makeText(context, getString(R.string.saved_settings), Toast.LENGTH_SHORT).show();}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(s.length() != 0) {
String waketime = String.valueOf(kurz.getText());
getSharedPreferences("MY_PREFERENCE", MODE_PRIVATE).edit().putString("xxxx", waketime).apply();
}
else { kurz.setText("1");
}
}
});
首先,我尝试将Toast添加到onTextChanged
-从逻辑上讲,这表明每次用户在字段中进行任何更改时Toast。
然后,如您在我的代码中看到的,我将Toast放在afterTextChanged
中,但没有任何变化。用户每次键入任何内容都会显示该消息,因此该消息显示了很多次。
在用户完成对字段的编辑后,我只想显示一次Toast(焦点停留在此,因为这是唯一的字段)。
例如,在编辑后有5秒钟的暂停,这意味着用户可能已完成编辑并仅在这种情况下显示烤面包
答案 0 :(得分:3)
我建议您在处理多个EditTexts
时不要遵循这种等待的概念。但是,由于您明确声明只有一个人,所以我会说您的方法很好。
无论如何要在5秒钟后显示Toast
(也许2-3秒比较合适),您基本上可以执行以下操作:
val handler = Handler()
val runnable = Runnable {
Toast.makeText(this@MainActivity, "Woop Woop", Toast.LENGTH_LONG).show()
}
kurz.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(p0: Editable?) {
handler.removeCallbacks(runnable)
handler.postDelayed(runnable, 5000)
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
})
我在这里做的是:
Handler
和一个Runnable
afterTextChanged
5秒内postDelay
Runnable
由于afterTextChanged
可以被多次调用,因此必须确保取消已经存在的postDelayed
Runnables
。为此,您可以在removeCallbacks
上调用Handler
。
(希望Kotlin代码不是问题)
编辑: Handler
和Runnable
在Java中如下所示:
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Woop Woop", Toast.LENGTH_LONG).show();
}
};