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


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

Двойной Макет Крана


Задача:

При нажатии на button1 он просто вызовет Intent 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 8

6 ответов:

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

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

Как Гейб Сечан сад:

Это можно сделать с помощью таймера (получить время, когда они нажимают на него, сохранить его, и если они нажимают его снова в течение, скажем, 100 мс игнорировать 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() завещания. выполнить и отключить кнопку.

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

btn.setOnclickListener(new View.onClickListener(){

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

          }
    });

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

Когда я использую selector drawable in Buttons и множество

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

Он выполняет событие onClick () при двойном щелчке мыши. Я случайно обнаружил, что он работает на android emulator api level 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;

          }
    }

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