Android EditText - 在用户完成编辑后显示 Toast
Android EditText - show Toast after user finished editing
我的 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 秒的暂停,这意味着用户可能完成编辑并仅在这种情况下显示 toast
我建议你在处理多个 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
postDelay
即Runnable
5秒
因为afterTextChanged
可以调用多次,所以你必须确保已经存在的postDelayed
Runnables
被取消了。您可以通过在 Handler
.
上调用 removeCallbacks
来完成此操作
(希望 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();
}
};
我的 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 秒的暂停,这意味着用户可能完成编辑并仅在这种情况下显示 toast
我建议你在处理多个 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
postDelay
即Runnable
5秒
因为afterTextChanged
可以调用多次,所以你必须确保已经存在的postDelayed
Runnables
被取消了。您可以通过在 Handler
.
removeCallbacks
来完成此操作
(希望 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();
}
};