Android предотвращает двойной щелчок по кнопке - PullRequest
138 голосов
/ 10 апреля 2011

Каков наилучший способ предотвращения двойного щелчка по кнопке в Android?

Ответы [ 39 ]

0 голосов
/ 05 апреля 2017

Если вы нажмете кнопку, вы откроете новый фрагмент, просто добавьте android:clickable="true" к корневому представлению нового фрагмента, который открывается.

0 голосов
/ 18 сентября 2013

более предпочтительным решением является

onclick(){
  btn.setEnabled(false);
  btn.setClickable(false);
  //yourwork
  myWork();
}

myWork(){
 //your tasks.
 btn.setEnabled(true);
 btn.setClickable(true);
}

Поскольку ссылку можно легко игнорировать, мне пришлось повторять это снова и снова

0 голосов
/ 04 августа 2016

Мне нужно было проснуться с фрагментами и просто поставить флажок, чтобы контролировать щелчки: я хочу только первый, остальные не могут получить доступ к слушателю

private boolean flag = true;

...

@Override
public void onClick(View view) {

    ...

    if (flag) {

        ...

        listener.onFragmentInteraction(Constants.MY_FRAGMENT, bundle);
        flag = false;
    }

    ...

}

Надеюсь, что это будет полезно, и поправьте меня, если это не правильно

0 голосов
/ 11 октября 2016

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

Объявите логически изменяемый логический элемент или блокировку внутри класса активности:

private volatile boolean saving = false;

Создайте кнопку с помощью onClickListener, который будет закрыт путем сохранения, и запустите фоновую задачу для выполнения работы:

saveButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        if (!saving) {
            saving = true;
            new SaveAsyncTask().execute();
        }
    }
});

Создайте внутренний класс SaveAsyncTask для работы в фоновом режиме:

class SaveAsyncTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object[] objects) {
        // Do something here, simulate a 3 second task
        SystemClock.sleep(3000);
        saving = false;
        return null;
    }
}
0 голосов
/ 26 октября 2016

Это мое решение:

if (waitDouble) {
    waitDouble = false;
    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                sleep(300);
                if (waitDouble == false) {
                    waitDouble = true;
                    singleClick();  //singleClick
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    thread.start();
} else {//DoubleClick
    DoubleClick();
    waitDouble = true;
}

Или другое решение:

public class NoDoubleClickUtils {
    private static long lastClickTime;
    private final static int SPACE_TIME = 500;

    public static void initLastClickTime() {
        lastClickTime = 0;
    }

    public synchronized static boolean isDoubleClick() {
        long currentTime = System.currentTimeMillis();
        boolean isClick2;
        if (currentTime - lastClickTime > SPACE_TIME) {
            isClick2 = false;
        } else {
            isClick2 = true;
        }
        lastClickTime = currentTime;
        return isClick2;
    }
}
0 голосов
/ 09 мая 2016

Универсальный раствор

@Override
        public void onClick(View v) {
            tempDisableButton(v);
            //all the buttons view..
        }

public void tempDisableButton(View viewBtn) {
        final View button = viewBtn;

        button.setEnabled(false);
        button.postDelayed(new Runnable() {
            @Override
            public void run() {
                button.setEnabled(true);
            }
        }, 3000);
    }
0 голосов
/ 26 июня 2014

Если вы не хотите (или не можете) использовать boolean flags или переопределить onClickListener, вы также можете попытаться объявить свою активность с помощью android:launchMode="singleTop" в AndroidManifest.xml.

Как это работает?

  • Если экземпляр действия находится на вершине стека - новое действие не будет создано, вместо этого - будет вызываться onNewIntent ().
  • Активность может иметь несколько экземпляров
  • Экземпляры могут находиться в разных задачах
  • Одна задача может иметь несколько экземпляров
0 голосов
/ 04 июля 2019

Kotlin создать класс SafeClickListener

class SafeClickListener(
        private var defaultInterval: Int = 1000,
        private val onSafeCLick: (View) -> Unit
) : View.OnClickListener {
    private var lastTimeClicked: Long = 0    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return
        }
        lastTimeClicked = SystemClock.elapsedRealtime()
        onSafeCLick(v)
    }
}

создать функцию в baseClass или иначе

fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}

и использовать нанажатие кнопки

btnSubmit.setSafeOnClickListener {
    showSettingsScreen()
}
0 голосов
/ 02 июня 2016

Только 2 шага, и вы можете использовать его везде в вашем приложении.

Step1 .создать синглтон для менеджера [избегая нескольких кликов]

package com.im.av.mediator;

import android.os.SystemClock;

import java.util.HashMap;

/**
 * Created by ShuHeng on 16/6/1.
 */
public class ClickManager {



    private HashMap<Integer,Long> laskClickTimeMap=new HashMap<Integer,Long>();
    public volatile static ClickManager mInstance =null;

    public static ClickManager getInstance(){
        if (mInstance == null) {
            synchronized(ClickManager.class) {
                if (mInstance == null) {
                    mInstance = new ClickManager();
                }
            }
        }
        return mInstance;
    }
   public boolean isClickable1s(Integer key){
       Long keyLong = laskClickTimeMap.get(key);
       if(keyLong==null){
           laskClickTimeMap.put(key,SystemClock.elapsedRealtime());
           return true;
       }else{
           if (SystemClock.elapsedRealtime() - keyLong.longValue() < 1000){
               return false;
           }else{
               laskClickTimeMap.put(key,new Long(SystemClock.elapsedRealtime()));
               return true;
           }
       }
   }
}  

Step2 .добавьте одну строку, чтобы избежать нескольких кликов.

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    int id = v.getId();
    if (id == R.id.iv_back) {
        if(!ClickManager.getInstance().isClickable1s(R.id.iv_back))return;
        //do something
    } else if (id == R.id.iv_light) {
        if(!ClickManager.getInstance().isClickable1s(R.id.iv_light))return;
        //do something
    } else if (id == R.id.iv_camerarotate) {
        if(!ClickManager.getInstance().isClickable1s(R.id.iv_camerarotate))return;
           //do something
    } else if (id == R.id.btn_delete_last_clip) {
        if(!ClickManager.getInstance().isClickable1s(R.id.btn_delete_last_clip))return;
          //do something

    } else if (id == R.id.iv_ok) {
        if(!ClickManager.getInstance().isClickable1s(R.id.iv_ok))return;
        //do something
    }
}
...