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
  • afterTextChangedpostDelayRunnable5秒

因为afterTextChanged可以调用多次,所以你必须确保已经存在的postDelayedRunnables被取消了。您可以通过在 Handler.

上调用 removeCallbacks 来完成此操作

(希望 Kotlin 代码不是问题)

编辑: HandlerRunnable 在 Java:

中看起来像这样
Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        Toast.makeText(MainActivity.this, "Woop Woop", Toast.LENGTH_LONG).show();
    }
};