Событие клика перенесено в следующую запущенную активность - PullRequest
5 голосов
/ 30 ноября 2011

На меня влияет странная обработка событий в Android. Моя проблема в том, что если пользователь нажимает на Button очень часто очень быстро, то событие ставится в очередь и переносится дальше на следующую Activity.

Вот пример:

<Button
  android:id="@+id/btn_home_show"
  style="@style/main_buttons"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/home_label_show" />

Activity onClick:

public void onClick(View view) {
    int viewId = view.getId();

    if (viewId == EXPECTED_VIEW_ID) {
        Intent intent = new Intent(this, CarouselActivity.class);
        startActivity(intent);
    }
}

В моем Activity у меня есть еще один элемент, который можно щелкнуть с такими же координатами на экране.

Что происходит, если пользователь действительно быстро щелкает на Button, тогда это событие щелчка переносится на только что запущенный Activity и происходит другая обработка onClick.

Я пробовал версии 2.3.3 и 2.3.5. Есть идеи?

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Ваша проблема не в том, что событие щелчка переносится на новое действие. Проблема в том, что после первого щелчка, который вы делаете, ваша новая активность начнет появляться. Если пользователь нажимает снова несколько раз, ваша новая активность загружается и получает щелчок, как и предполагалось. Я предполагаю, что вы блокируете UI-поток во время изменения активности, и из-за этого пользователь не уверен, нажал ли он на кнопку и попытается ли нажать на нее снова.

Попытайтесь ускорить переключение Активности. Вы можете просто показать Overlay с Spinner, который отлавливает все события щелчка, пока вы не готовы показать правильный пользовательский интерфейс действия. Таким образом, пользователь понимает, что что-то произошло, перестает щелкать и ждет, пока закручиватель исчезнет.

1 голос
/ 30 ноября 2011

Простым решением было бы добавить логическое значение, которое определяет, обрабатывается ли щелчок, затем создает поток, который спит, затем устанавливает значение в true

public void onClick(View view) {

    if (inputAllowed) {
        //do stuff
    }
}

boolean inputAllowed = true;
private class ButtonDelay extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Void doInBackground(Void... params) {

        try {
            inputAllowed = false;

            Thread.sleep(500);
            inputAllowed = true;
        } catch (InterruptedException e) {

            e.printStackTrace();
        }
        return null;

    }

    @Override
    protected void onPostExecute(final Void unused) {

    }

}

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

...