Как решить проблему двойного нажатия на кнопку в android?

макет моего приложения :

Double Tap Mockup


:

при нажатии на button1 это просто вызов намерение of ActivitySecond

button1.setOnClickListener(this);

public void onClick(View v) {
// TODO Auto-generated method stub
     switch (v.getId()) 
     {
          case R.id.button1:
                Intent intent = new Intent(getApplicationContext(), ActivitySecond.class);
                startActivity(intent);
                break;
          default:
                break;
     }
}

но, дважды нажмите его открытым два раза ActivitySecond.


КАК ЕГО РЕШИТЬ.

ПОЖАЛУЙСТА, ЕСЛИ КАКОЕ-ЛИБО РЕШЕНИЕ, ТО ПОДЕЛИТЕСЬ ИМ.

спасибо.

6 ответов


вы можете установить launchMode ActivitySecond to singleTop

<activity android:name=".ActivitySecond"
            android:launchMode="singleTop"
            >
            ...
</activity>

как Гейб Sechan грустно:

это можно сделать с помощью таймера (получите время, когда они нажимают на него, сохраните его, и если они нажмут его снова, скажем, 100ms игнорируют 2-й щелчок)

вот реализация, которую я использовал в своем проекте:

public abstract class OnOneClickListener implements View.OnClickListener {
    private static final long MIN_CLICK_INTERVAL = 1000; //in millis
    private long lastClickTime = 0;

    @Override
    public final void onClick(View v) {
        long currentTime = SystemClock.elapsedRealtime();
        if (currentTime - lastClickTime > MIN_CLICK_INTERVAL) {
            lastClickTime = currentTime;
            onOneClick(v);
        }
    }

    public abstract void onOneClick(View v);
}

просто использовать OnOneClickListener вместо OnClickListener и выполнить свой код в onOneClick() метод.

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


Это называется debouncing - это классическая проблема в аппаратном и программном обеспечении. Есть несколько трюков, которые вы можете сделать, но все они сводятся к временному отключению кнопки и ее повторному включению позже. Это можно сделать с помощью таймера (получите время, когда они нажимают на него, сохраните его, и если они нажмут его снова, скажем, 100ms игнорируют 2-й щелчок). Другим способом было бы отключить кнопку после onClick и повторно включить ее, когда новое действие завершится через onActivityResult. Или есть дюжина других способов, выбрать самый простой для вас.


btn.setOnclickListener(new View.onClickListener(){

          public void onClick(View v) {
                btn.setEnabled(false);

          }
    });

вы должны сделать setEnabled (false) в событии onlclick.


когда я использую селектор drawable в кнопках и сет

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

он выполняет событие onClick () при двойном щелчке мыши. Я случайно обнаружил, что он работает на уровне api эмулятора android 10, Android 2.3.3 Не тестировался на реальном устройстве. Вот полный код.

               <Button
                android:layout_width="50dp"
                android:layout_height="wrap_content"
                android:text="Discover"
                android:id="@+id/Button1"
                android:layout_weight=".5"
                android:layout_margin="0dp"
                android:background="@drawable/btn_nearby"
                android:contentDescription="gjhfjhkjhgkvkjh"
                android:drawableLeft="@drawable/ic_follow"
                android:paddingLeft="20dp"
                android:paddingRight="0dp"
                android:drawablePadding="-10dp"
                android:textSize="16sp"
                android:paddingTop="2.5dp"
                android:paddingBottom="2.5dp"
                android:clickable="true"
                android:focusable="true"
                android:focusableInTouchMode="true"/> 

И Код Java

    @Override
    public void onClick(View view) {
        switch(view.getId()) {

            case R.id.Button1:
                onButton1Click();
                break;

            case R.id.Button2:
                onButton2Click();
                break;

          }
    }

Я просто представлю третье решение для этого. Я решил это, добавив логическое значение, которое использовалось для проверки, запущена ли операция (которую запускает кнопка) или нет.