Android EditText - показать тост после того, как пользователь закончил редактирование - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть EditText в моем коде Android, и я хочу показать сообщение 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 - логически это показывалоТост каждый раз, когда пользователь изменял что-либо в поле.

Затем, как вы можете видеть в моем коде, я вставил Тост в afterTextChanged, но ничего не изменилось.Сообщение показывается каждый раз, когда пользователь что-то вводит, поэтому сообщение отображается много раз.

Я хочу показать тост только один раз, после того, как пользователь закончил редактировать поле (фокус остается там, так как этотолько поле).

Таким образом, если после редактирования есть 5-секундная пауза, это, вероятно, означает, что пользователь закончил редактирование и в этом случае показывает только тост

1 Ответ

0 голосов
/ 27 ноября 2018

Я бы посоветовал вам не следовать этой концепции ожидания, когда вы имеете дело с несколькими EditTexts.Однако, поскольку вы прямо заявили, что у вас есть только один, я бы сказал, что ваш подход хорош.

В любом случае, чтобы показать ваш Toast через 5 секунд (возможно, 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 отменены.Вы делаете это, вызывая removeCallbacks на Handler.

(Надеюсь, код Котлина не является проблемой)

РЕДАКТИРОВАТЬ: 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();
    }
};
...