Как предотвратить повторение действий при двойном нажатии на кнопку? - PullRequest
0 голосов
/ 02 февраля 2019

Вот мои действия в onClick ().Проблема в том, что если я нажму кнопку дважды, новое действие будет открыто дважды.Я пытался использовать setEnabled () и setClickable (), но это не работает.Он по-прежнему показывает более одного действия

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), 
CalendarActivity.class);
            intent.putExtra("day", 16);
            intent.putExtra("month", 12);
            intent.putExtra("year", 1996);
            startActivityForResult(intent, CALENDAR_ACTIVITY_CODE);
        }
    });

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Это на самом деле удивительно сложная проблема.Корень проблемы заключается в том, что события пользовательского интерфейса (например, нажатие кнопки) приводят к тому, что messages «отправляется» в конец очереди сообщений.Если вы достаточно быстры, многие из этих сообщений могут быть отправлены в очередь сообщений до того, как будет обработана первая.

Это означает, что даже отключение кнопки внутри вашего метода onClick() не будет действительнорешить проблему (поскольку отключение не произойдет до тех пор, пока не будет обработано первое сообщение, но в очереди сообщений уже может быть три других дублирующих сообщения).

Лучше всего отслеживатькакой-то логический флаг и проверяет флаг каждый раз внутри onClick():

private boolean firstClick = true;
button.setOnClickListener(v -> {
    if (firstClick) {
        firstClick = false;
        // do your stuff
    }
});

Вы должны помнить, чтобы сбросить firstClick обратно в true, когда вы хотитеРазумеется, снова включите нажатие кнопок.

0 голосов
/ 02 февраля 2019

Чтобы решить эту проблему, вы можете использовать библиотеку Jake Wharton Rxbinding, которая позволяет преобразовывать события щелчка в поток.

Вы можете добавить событие газа, которое помогает остановить событие в указанное время.

RxView.clicks(button).throttleFirst(2, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread()).
                        subscribe(new Consumer<Object>() {
                            @Override
                            public void accept(Object o) {
                                Toast.makeText(getApplicationContext(), "Avoid multiple clicks using throttleFirst", Toast.LENGTH_SHORT).show();
                            }
                        });

0 голосов
/ 02 февраля 2019

Попробуйте отключить нажатие кнопки после первого нажатия:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //add this line
    button.setClickable(false);
        Intent intent = new Intent(getActivity(), 
CalendarActivity.class);
        intent.putExtra("day", 16);
        intent.putExtra("month", 12);
        intent.putExtra("year", 1996);
        startActivityForResult(intent, CALENDAR_ACTIVITY_CODE);
    }
});

Если это не поможет, вы можете перейти к своей деятельности в манифесте и добавить это:

android:launchMode = "singleTop"
...