【问题标题】:Android EditText - show Toast after user finished editingAndroid EditText - 用户完成编辑后显示 Toast
【发布时间】:2019-04-29 15:25:51
【问题描述】:

我的 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

【问题讨论】:

  • 有没有更好的方法来确定用户完成输入而不是 5 秒超时?
  • 你在问我吗? :) 我只是提出了这个想法,不确定是否有其他解决方案可以做到这一点。实际上我可以使用计时器,但计时器每次都会创建新线程来运行任务。例如。如果用户插入 100 个字符,计时器启动 100 次

标签: android android-edittext android-toast


【解决方案1】:

我建议您在处理多个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 postDelayRunnable 5 秒

由于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();
    }
};

【讨论】:

  • 好吧,只是想问那个'val',现在我看到它是 Kotlin :) 没有使用它,但感谢 Handler 的想法
  • 如果你愿意,我可以用 Java 重写它;) 或者问我你是否理解它有困难。 val 只是指一个常量值。
  • val 与 final 变量相同
  • 方法调用是一样的(removeCallbacks / postDelayed)只是最后少了一个分号。
  • 完美!现在它正在按我的意愿工作。我设置为2000ms,没问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-02-06
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多