অ্যান্ড্রয়েড প্রতিরোধকারী একটি বোতামে ডাবল ক্লিক করুন


177

অ্যান্ড্রয়েডের একটি বোতামে ডাবল ক্লিকগুলি রোধ করার সর্বোত্তম উপায় কী?


3
কিজেটের সমাধানটি কেবল সম্পূর্ণরূপে
কার্যক্ষম

3
কিজেটের সমাধানটি গ্রহণ করা উচিত ছিল, যাতে এই পৃষ্ঠাগুলিতে যে সমস্ত লোকেরা যান, তারা সেটএবলিত (মিথ্যা) ব্যবহারের অসুবিধাগুলি জানতে পারেন।
লাভফোর্ডড্রয়েড

আপনি সর্বশেষ-ক্লিক-সময় সমাধানটি ব্যবহার করে আমার লাইব্রেরিটি চেষ্টা করতে পারেন: github.com/RexLKW/SClick
Rex Lam

1
@ অ্যান্ড্রয়েডার দয়া করে আপনার সেরা উত্তরটি পরিবর্তন করুন
আমির 133

উত্তর:


86

setEnabled(false)ব্যবহারকারীর পক্ষে এটিতে আবার ক্লিক করা নিরাপদ না হওয়া পর্যন্ত বোতামটি অক্ষম করুন।


47
সেটএবলড (মিথ্যা) যথেষ্ট "দ্রুত" কাজ করে না বলে মনে হচ্ছে। আমি একটি বোতামের জন্য একটি View.OnClickListener.onClick (দেখুন) সেট আপ করেছি। আমি অনক্লিক () এ প্রথম জিনিসটি হ'ল লগ-বিবৃতি লিখি, ২ য় স্টেটমেন্টটি হ'ল বাটন.সেটএনেবল (মিথ্যা)। এমুলেটরটিতে দ্রুত-ডাবল-ক্লিক করার সময় আমি দেখতে পাই লগ-বিবৃতিটি দু'বার প্রদর্শিত হবে! ঠিক তার পরেও একটি সেট ক্লিকযোগ্য (মিথ্যা) যুক্ত করার পরে, লগ-বিবৃতিটি দুটিবার উপস্থিত হয়।
কিউকিউউশনস

হুম, অনক্লিক () এর শেষে সেটএবলড (সত্য) পর্যন্ত কোডটি এত তাড়াতাড়ি কার্যকর করা হচ্ছে যে এটি ইতিমধ্যে আবার সক্ষম হয়ে গেছে ...
QQQuestions

91
আমারও একই সমস্যা ছিল। একজন সহায়ক ভদ্রলোকের মতে, অ্যান্ড্রয়েড আসলে ক্লিকগুলিকে সারি করে দেয়, তাই আপনার অনক্লিক () কোডটি কতটা দ্রুত বা ধীর করে দেয় তাতে কিছু যায় আসে না; শুধুমাত্র আপনি কত দ্রুত বোতামটি ক্লিক করেন। অর্থাৎ। আপনি ইতিমধ্যে বোতামটি অক্ষম করে রেখেছেন, তবে ক্লিকের সারিটি ইতিমধ্যে দুটি বা তিনটি ক্লিক দিয়ে পূর্ণ হয়ে গেছে এবং বোতামটি নিষ্ক্রিয় করার ফলে সারিযুক্ত ক্লিকগুলি সরবরাহ করার কোনও প্রভাব নেই। (যদিও এটি করা উচিত?)
নিক

3
সেই বিরল মুহূর্তটি যখন আপনি দেখছেন যে 'কেউ' একটি সঠিক উত্তর দেয় এবং প্রশ্নের উত্তর জিজ্ঞাসা করা হয় না তবে তার উত্তর দেওয়া হয়:: পি
রাহুল

এটি সর্বদা সঠিক সমাধান নয়। যদি আপনার অনক্লিক ব্যয়বহুল অপারেশন হয় তবে বোতামটি যথেষ্ট দ্রুত অক্ষম হবে না। সম্পূর্ণ-প্রমাণ সমাধান আইএমএইচও হ'ল শেষ ক্লিকের সময়টি ব্যবহার করা, তবে আপনি যদি অপারেশনটি কিছুক্ষণ স্থায়ী হওয়ার প্রত্যাশা করেন (যেমন লগইন হিসাবে) তবে এটিতে আবার ল্যাপিং এড়ানোর জন্য বোতামটি অক্ষম করুন।
সারং

368

ক্লিক করার সময় একটি শেষ ক্লিকের সময় সাশ্রয় করা এই সমস্যাটিকে প্রতিরোধ করবে।

অর্থাত

private long mLastClickTime = 0;

...

// inside onCreate or so:

findViewById(R.id.button).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // mis-clicking prevention, using threshold of 1000 ms
        if (SystemClock.elapsedRealtime() - mLastClickTime < 1000){
            return;
        }
        mLastClickTime = SystemClock.elapsedRealtime();

        // do your magic here
    }
}

21
এটিই একমাত্র সমাধান যা আসলে ডাবল ক্লিককে বাধা দেয়। এই পদ্ধতিটি বেশ ছোঁয়াচে হওয়ায় আমি কেবল অন্য সকলকে চেষ্টা করে এক ঘন্টা ব্যয় করেছি, তবে এগুলির ব্যতীত কেউই কোনও দৃশ্যের দ্রুত ডাবল ট্যাপ প্রতিরোধ করতে পারেনি। গুগল দয়া করে এটি ঠিক করুন :)
ashishduh

6
এই সমাধানটি সূক্ষ্মভাবে কাজ করে T আপনার যখন স্ক্রিনে একাধিক বোতাম রয়েছে এবং আপনি কেবলমাত্র একটি একক বোতামটি ক্লিক করতে চান তখন এই সমাধানটিও কার্যকর হয়।
অকার্যকর

12
আপনি পর্যাপ্ত পরিমাণে ডাবল ক্লিক করলে এটি ডাবল ক্লিকগুলিকে সম্পূর্ণরূপে প্রতিরোধ করে না।
অবস্থানঃ

4
সেরা উত্তর, এটি শীর্ষে থাকা উচিত
গেন্নাদি রাইবকিন

3
এই সমাধানটির সঠিক উত্তর হওয়া উচিত ... সেটএবলড (মিথ্যা) যথেষ্ট নয়।
হেলোইসিসিম

55

আমার সমাধানটি হ'ল

package com.shuai.view;

import android.os.SystemClock;
import android.view.View;

/**
 * 处理快速在某个控件上双击2次(或多次)会导致onClick被触发2次(或多次)的问题
 * 通过判断2次click事件的时间间隔进行过滤
 * 
 * 子类通过实现{@link #onSingleClick}响应click事件
 */
public abstract class OnSingleClickListener implements View.OnClickListener {
    /**
     * 最短click事件的时间间隔
     */
    private static final long MIN_CLICK_INTERVAL=600;
    /**
     * 上次click的时间
     */
    private long mLastClickTime;

    /**
     * click响应函数
     * @param v The view that was clicked.
     */
    public abstract void onSingleClick(View v);

    @Override
    public final void onClick(View v) {
        long currentClickTime=SystemClock.uptimeMillis();
        long elapsedTime=currentClickTime-mLastClickTime;
        //有可能2次连击,也有可能3连击,保证mLastClickTime记录的总是上次click的时间
        mLastClickTime=currentClickTime;

        if(elapsedTime<=MIN_CLICK_INTERVAL)
            return;

        onSingleClick(v);        
    }

}

ব্যবহার অনক্লিকলিস্টনার হিসাবে অনুরূপ তবে এর পরিবর্তে অনসিংক্লিক () টি ওভাররাইড করুন:

mTextView.setOnClickListener(new OnSingleClickListener() {
            @Override
            public void onSingleClick(View v) {
                if (DEBUG)
                    Log.i("TAG", "onclick!");
            }
     };

1
স্বয়ংক্রিয়ভাবে ডাবল ছোঁয়া প্রতিরোধ করার জন্য সহজ এবং নিখুঁত।
বেনিয়ামিন পিট 11

1
আপনি পর্যাপ্ত পরিমাণে ডাবল ক্লিক করলে এটি ডাবল ক্লিকগুলিকে সম্পূর্ণরূপে প্রতিরোধ করে না।
অবস্থানঃ

1
দুর্দান্ত সমাধান। আমি সবেমাত্র MIN_CLICK_INTERVAL = 1000 পরিবর্তন করেছি;
নিজাম

5
আমি যদি প্রতি 0.5 সেকেন্ডে নির্ভুলভাবে বোতামটি চাপতাম তবে আমার পরবর্তী ক্লিকগুলির কোনওটিই পেতে পারে না কারণ mLastClickTime প্রতিটি ক্লিক আপডেট করা হত। আমার পরামর্শটি হ'ল mLastClickTime বরাদ্দ করার পরে আপনি বিরতি পরীক্ষা করে দেখুন।
2col

mLastClickTime = currentClickTime; (বিচ্ছিন্ন সময় <= MIN_CLICK_INTERVAL) ফিরে আসার পরে স্থাপন করা উচিত;
Loyea

41

আপনি অনক্লিক ()-তে গণনাগতভাবে নিবিড় কাজ করছেন বাটনটি অক্ষম করার আগে ক্লিক ইভেন্টগুলি সারিবদ্ধ হয়ে উঠলে বোতামটি অক্ষম করা বা সঙ্কোচনীয় সেট করা যথেষ্ট নয় not আমি একটি বিমূর্ত বেস ক্লাস লিখেছিলাম যা অনিক্লিকলিস্টনার প্রয়োগ করে যা আপনি পরিবর্তে ওভাররাইড করতে পারেন, এটি কোনও সারিবদ্ধ ক্লিককে উপেক্ষা করে এই সমস্যার সমাধান করে:

/** 
 * This class allows a single click and prevents multiple clicks on
 * the same button in rapid succession. Setting unclickable is not enough
 * because click events may still be queued up.
 * 
 * Override onOneClick() to handle single clicks. Call reset() when you want to
 * accept another click.
 */
public abstract class OnOneOffClickListener implements OnClickListener {
    private boolean clickable = true;

    /**
     * Override onOneClick() instead.
     */
    @Override
    public final void onClick(View v) {
        if (clickable) {
            clickable = false;
            onOneClick(v);
            //reset(); // uncomment this line to reset automatically
        }
    }

    /**
     * Override this function to handle clicks.
     * reset() must be called after each click for this function to be called
     * again.
     * @param v
     */
    public abstract void onOneClick(View v);

    /**
     * Allows another click.
     */
    public void reset() {
        clickable = true;
    }
}

ব্যবহার অনক্লিকলিস্টনার হিসাবে একই তবে অননক্লিক () পরিবর্তে ওভাররাইড করুন:

OnOneOffClickListener clickListener = new OnOneOffClickListener() {
    @Override
    public void onOneClick(View v) {

        // Do stuff

        this.reset(); // or you can reset somewhere else with clickListener.reset();
    }
};
myButton.setOnClickListener(clickListener);

কোডের জন্য ধন্যবাদ। আপনি এখানে যা লিখেছেন তার উপর ভিত্তি করে আমি একই ধরণের ক্লাস তৈরি করেছি যা বোতাম বা এর পিতামাত্রে লুকিয়ে থাকলে ক্লিকগুলি প্রতিরোধ করে - এটি মজার বিষয় যে আপনি ক্লিকের পরপরই বোতামটি আড়াল করলেও অ্যান্ড্রয়েড ক্লিকগুলিকে সারি করবে।
নকিব 3ro

1
আমারও অনুরূপ সমাধান রয়েছে - আপনি কেবল এই ক্লাসটি এক্সএমএলে ব্যবহার করতে পারেন এবং এটি আপনার জন্য ক্লিকলিস্টারগুলি আবদ্ধ
ডোরি

2
এটি একটি ভাল সমাধান, কিন্তু onClick () এবং রিসেট () প্রয়োজন সিঙ্ক্রোনাইজ করা হবে, অন্যথায় একটি ডবল-ক্লিক এখনও ছিঁচকে চোর পারবেন না।
টম anMoney

6
@ তোমানমনি, কেমন আছেন? সমস্ত ক্লিক ইভেন্টগুলি কি একক ইউআই থ্রেডে ঘটে না?
কেন

@ ডরি লিঙ্কটি মারা গেছে
ন্যাক্সা

36

আপনি কোটলিন এক্সটেনশন ফাংশন এবং আরএক্সবাইন্ডিং দিয়ে এটি খুব অভিনব উপায়ে করতে পারেন

   fun View.clickWithDebounce(debounceTime: Long = 600L, action: () -> Unit): Disposable =
        RxView.clicks(this)
                .debounce(debounceTime, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { action() }

অথবা

fun View.clickWithDebounce(debounceTime: Long = 600L, action: () -> Unit) {
    this.setOnClickListener(object : View.OnClickListener {
        private var lastClickTime: Long = 0

        override fun onClick(v: View) {
            if (SystemClock.elapsedRealtime() - lastClickTime < debounceTime) return
            else action()

            lastClickTime = SystemClock.elapsedRealtime()
        }
    })
}

এবং তারপরে ঠিক:

View.clickWithDebounce{ Your code }

ওভার এনজেনারিং
সার্জ বুরলাকা

3
আরএক্সের জন্য ডেবিউন এখানে ভাল কাজ করবে না। পরিবর্তে "থ্রোটল ফার্স্ট" আরও ভাল ফিট করা উচিত। এখানে কীভাবে তারা পার্থক্য করে তার উদাহরণ এখানে ডেমো.নিমিয়াস.এন. / ডেবিউন_থ্রোটল । পিএস: এবং প্রকৃতপক্ষে আপনার ক্লিক উইথডিউনস বাস্তবায়ন থ্রোটাল বাস্তবায়ন, আত্মপ্রকাশ নয়
ক্রসোভোচকিন

13

আমিও একই ধরণের সমস্যায় পড়েছি, আমি কিছু ডেটপিকার এবং টাইমপিকার প্রদর্শন করছিলাম যেখানে কখনও কখনও এটি 2 বার ক্লিক হয়। আমি এটি দ্বারা এটি সমাধান করেছি

long TIME = 1 * 1000;
@Override
public void onClick(final View v) {
v.setEnabled(false);

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            v.setEnabled(true);
        }
    }, TIME);
}

আপনার প্রয়োজন অনুসারে আপনি সময় পরিবর্তন করতে পারেন। এই পদ্ধতিটি আমার পক্ষে কাজ করে।


এটি আসল সমাধান, যেহেতু সময় শেষ হওয়ার পরে এটি স্বয়ংক্রিয়ভাবে বোতামটি পুনরায় সক্রিয় করে। অন্যান্য সমাধানগুলি যদি আপনি দ্রুত দুটি বার ক্লিক করেন তবে বোতামটি স্থায়ীভাবে অবরুদ্ধ করুন। এই সমাধান সমস্যার সমাধান! ধন্যবাদ
নস্টর

10

setEnabled(false) আমার জন্য পুরোপুরি কাজ করে।

ধারণাটি হ'ল আমি প্রথম দিকে লিখি { setEnabled(true); }এবং কেবল এটি falseবোতামের প্রথম ক্লিকে তৈরি করি।


9

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি এই সাধারণ সমস্যাটি সমাধান করার জন্য সবচেয়ে ভাল সমাধানটি ভাগ করে নিই

        btnSomeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Prevent Two Click
            Utils.preventTwoClick(view);
            // Do magic
        }
    });

এবং অন্য ফাইলটিতে, যেমন ইউটিলস.জভা

    /**
 * Método para prevenir doble click en un elemento
 * @param view
 */
public static void preventTwoClick(final View view){
    view.setEnabled(false);
    view.postDelayed(new Runnable() {
        public void run() {
           view.setEnabled(true);
        }
    }, 500);
}

8

এই সমস্যার আসল সমাধানটি হ'ল সেটএনেবলড (মিথ্যা) যা বোতামটি ধরিয়ে দেয় এবং সেটকলিকযোগ্য (মিথ্যা) যা এটি তৈরি করে যাতে দ্বিতীয় ক্লিকটি গ্রহণ করা যায় না আমি এটি পরীক্ষা করে দেখেছি এবং এটি খুব কার্যকর বলে মনে হচ্ছে।


7

কেউ যদি এখনও একটি সংক্ষিপ্ত উত্তর খুঁজছেন আপনি নীচের কোডটি ব্যবহার করতে পারেন

 private static long mLastClickTime = 0;
  if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) { // 1000 = 1second
         return;
    }
 mLastClickTime = SystemClock.elapsedRealtime();

এই কোডটি if statementযখনই ব্যবহারকারী ক্লিক করবে View within 1 secondএবং তারপরে return;কোডটি সূচিত হবে এবং পরবর্তী কোডটি আরম্ভ করবে না inside


2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সুপার সিম্পল এবং আপনি খুব দ্রুত ক্লিক করলেও এটি কাজ করে! এর জন্য ধন্যবাদ.
জিওফ্রয় CALA

7

কে LEANEST Kotlin কথ্য উপায়:

class OnSingleClickListener(private val block: () -> Unit) : View.OnClickListener {

    private var lastClickTime = 0L

    override fun onClick(view: View) {
        if (SystemClock.elapsedRealtime() - lastClickTime < 1000) {
            return
        }
        lastClickTime = SystemClock.elapsedRealtime()

        block()
    }
}

fun View.setOnSingleClickListener(block: () -> Unit) {
    setOnClickListener(OnSingleClickListener(block))
}

ব্যবহার:

button.setOnSingleClickListener { ... }

6

আমার সমাধানটি একটি booleanভেরিয়েবল ব্যবহার করার চেষ্টা করা হচ্ছে :

public class Blocker {
    private static final int DEFAULT_BLOCK_TIME = 1000;
    private boolean mIsBlockClick;

    /**
     * Block any event occurs in 1000 millisecond to prevent spam action
     * @return false if not in block state, otherwise return true.
     */
    public boolean block(int blockInMillis) {
        if (!mIsBlockClick) {
            mIsBlockClick = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mIsBlockClick = false;
                }
            }, blockInMillis);
            return false;
        }
        return true;
    }

    public boolean block() {
        return block(DEFAULT_BLOCK_TIME);
    }
}

এবং নীচের হিসাবে ব্যবহার:

view.setOnClickListener(new View.OnClickListener() {
            private Blocker mBlocker = new Blocker();

            @Override
            public void onClick(View v) {
                if (!mBlocker.block(block-Time-In-Millis)) {
                    // do your action   
                }
            }
        });

আপডেট : দেখুন এক্সটেনশন ব্যবহার করে কোটলিন সমাধান

fun View.safeClick(listener: View.OnClickListener, blockInMillis: Long = 500) {
    var lastClickTime: Long = 0
    this.setOnClickListener {
        if (SystemClock.elapsedRealtime() - lastClickTime < blockInMillis) return@setOnClickListener
        lastClickTime = SystemClock.elapsedRealtime()
        listener.onClick(this)
    }
}

5

বাটার ছুরির সাথে ক্লিক গার্ড ভাল কাজ করে

ClickGuard.guard(mPlayButton);

4
হ্যান্ডল বোতামে ডাবল ক্লিকের জন্য সেপ্রেটি ল্যানারি? হা
সার্জ বুরলাকা

আমি কি কাস্টম বোতামের ভিতরে এটি ব্যবহার করতে পারি?
আরা বদালায়ান

@ আরাবাদলায়ান 'অভ্যন্তরীণ' বলতে কী বোঝায়? গার্ড পদ্ধতির জন্য পরম হিসাবে আপনার কাস্টম বোতামটি পাস করুন। তারপরে আপনার বোতামটি ডাবল ক্লিক থেকে রক্ষা করবে
Thanhbinh84

মানে আমি অনক্লিক ব্যবহার করা সমস্ত ক্রিয়াকলাপে ক্লিকগার্ড.গার্ড (এমপ্লেবটন) যুক্ত করতে চাই না। আমি কাস্টমবটন ব্যাপ্তি বাটনটি তৈরি করতে এবং কাস্টম বাটনের ভিতরে ক্লিকগার্ড রাখতে চাই। কিন্তু আমি কাস্টমবটন কনস্ট্রাক্টরে ক্লিকগার্ড যুক্ত করার পরে এটি কার্যকর হয়নি।
আরা বদালিয়ান

@ আরবডালায়ান ঠিক আছে এটি সেভাবে কাজ করে না।
Thanhbinh84

5

আমার পরিস্থিতিতে আমি একটি বোতাম ভিউ ব্যবহার করছিলাম এবং এটি ক্লিকগুলি খুব দ্রুত নিচ্ছিল। কেবল ক্লিকযোগ্য অক্ষম করুন এবং কয়েক সেকেন্ড পরে আবার সক্ষম করুন ...

মূলত আমি একটি মোড়কের ক্লাস তৈরি করেছি যা আপনার ভিউ অনক্লিকলিস্টনারকে ঘিরে রাখে। আপনি চাইলে কাস্টম বিলম্বও সেট করতে পারেন।

public class OnClickRateLimitedDecoratedListener implements View.OnClickListener {

    private final static int CLICK_DELAY_DEFAULT = 300;
    private View.OnClickListener onClickListener;
    private int mClickDelay;


        public OnClickRateLimitedDecoratedListener(View.OnClickListener onClickListener) {
            this(onClickListener, CLICK_DELAY_DEFAULT);
        }

        //customize your own delay
        public OnClickRateLimitedDecoratedListener(View.OnClickListener onClickListener, int delay) {
            this.onClickListener = onClickListener;
            mClickDelay = delay;
        }

        @Override
        public void onClick(final View v) {
            v.setClickable(false);
            onClickListener.onClick(v);

            v.postDelayed(new Runnable() {
                @Override
                public void run() {
                    v.setClickable(true);
                }
            }, mClickDelay);
        }
    }

এবং এটিকে বলা সহজভাবে এটি করুন:

mMyButton.setOnClickListener(new OnClickRateLimitedDecoratedListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 doSomething();
             }
         }));

বা আপনার নিজস্ব বিলম্ব প্রদান:

 mMyButton.setOnClickListener(new OnClickRateLimitedDecoratedListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
                         doSomething();
                     }
                 },1000));

আপডেট: উপরে উপায়ে একটু পুরানো ফ্যাশন এখন আরএক্সজবা এতটাই প্রচলিত। অন্যরা যেমন বলেছে, অ্যান্ড্রয়েডে আমরা ক্লিকগুলি ধীর করার জন্য একটি থ্রোটল ব্যবহার করতে পারি। এখানে একটি উদাহরণ:

 RxView.clicks(myButton)
                    .throttleFirst(2000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
                    .subscribe {
                        Log.d("i got delayed clicked")
                    }
        }

আপনি এটির জন্য এই লাইব্রেরিটি ব্যবহার করতে পারেন: implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'



4

আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন। পোস্ট বিলম্ব ব্যবহার করে আপনি ডাবল ক্লিক ইভেন্টগুলির জন্য যত্ন নিতে পারেন।

অকার্যকর ডিবাউনএফেক্টফোর্ড ক্লিক (দেখুন দেখুন) {

    view.setClickable(false);

    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            view.setClickable(true);

        }
    }, 500);
}

4

কোটলিন এক্সটেনশন যা সংক্ষিপ্ত ইনলাইন কোড এবং পরিবর্তনশীল ডাবল ক্লিকের অপেক্ষা করার জন্য অনুমতি দেয়

fun View.setDoubleClickListener(listener: View.OnClickListener, waitMillis : Long = 1000) {
    var lastClickTime = 0L
    setOnClickListener { view ->
        if (System.currentTimeMillis() > lastClickTime + waitMillis) {
            listener.onClick(view)
            lastClickTime = System.currentTimeMillis()
        }
    }
}

ব্যবহার:

anyView.setNoDoubleClickListener(View.OnClickListener { v ->
    // do stuff
})

অথবা

anyView.setNoDoubleClickListener(View.OnClickListener { v ->
    // do stuff
}, 1500)

আশ্চর্যজনক, প্রত্যেকের এটি ব্যবহার করা উচিত, এটির একেবারে দুর্দান্ত কোডের টুকরো এবং কেন কোটলিনে মাইগ্রেশন করা উচিত তার দুর্দান্ত কারণ।
আছমাদ নওফাল সাইফিক 14'19

আরও ভাল হতে পারে যদি ওয়েটমিলিসটি কেবল হার্ডকোডযুক্ত থাকে তবে বাহ্যিক বন্ধনীগুলি নির্মূল করা যায়।
উইন্ডারাইডার

4

নীচের কোডটি ব্যবহারকারীকে কয়েক সেকেন্ডের ভগ্নাংশের মধ্যে একাধিকবার ক্লিক করতে বাধা দেয় এবং কেবল 3 সেকেন্ডের পরে অনুমতি দেয়।

private long lastClickTime = 0;

View.OnClickListener buttonHandler = new View.OnClickListener() {
    public void onClick(View v) {
        // preventing double, using threshold of 3000 ms
        if (SystemClock.elapsedRealtime() - lastClickTime < 3000){
            return;
        }

        lastClickTime = SystemClock.elapsedRealtime();
    }
}

3

দেখে মনে হচ্ছে আপনার ক্লিক শ্রোতাদের অন রিসুমিতে সেট করা এবং অনপস এ তাদের বাতিল করে দেওয়া কৌশলটিও কৌশল করে।


3

আমার জন্য কেবল টাইমস্ট্যাম্প মনে রাখা এবং এর বিপরীতে পরীক্ষা করা (যেটি পূর্ববর্তী ক্লিকের পরে 1 সেকেন্ডের বেশি পেরিয়ে গেছে) সহায়তা করেছিল।


3

আমি আশা করি এটি আপনাকে সহায়তা করতে পারে, কোডটিকে ইভেন্ট ইভেন্টের মধ্যে রাখুন।

// ------------------------------------------------ --------------------------------

    boolean hasTag = null != which.getTag( R.id.preventing_double_click_tag );

    if ( hasTag ) {
        // Do not handle again...
        return;
    } else {
        which.setTag( R.id.action, Boolean.TRUE );

        which.postDelayed( new Runnable() {
            @Override
            public void run() {
                which.setTag( R.id.action, null );
                Log.d( "onActin", " The preventing double click tag was removed." );
            }

        }, 2000 );
    }

3

অনক্লিক পদ্ধতিটি যদি তাৎক্ষণিকভাবে না ফিরে আসে তবে আমি এই প্রস্তাবগুলির কোনওটিই কাজ করে না। টাচ ইভেন্টটি অ্যান্ড্রয়েড দ্বারা সারিবদ্ধ করা হয় এবং পরবর্তী অনক্লিকটি কেবল প্রথমটি শেষ হওয়ার পরে ডাকা হয়। (যেহেতু এটি এক ইউআই থ্রেডটিতে করা হয়েছে এটি সত্যই স্বাভাবিক)) অনক্লিক ফাংশনটি সমাপ্ত হওয়ার সময় আমাকে সময়টি ব্যবহার করতে হবে + প্রদত্ত অনক্লিকটি চলছে কিনা তা চিহ্নিত করার জন্য একটি বুলিয়ান ভেরিয়েবল। এই উভয় চিহ্নিতকারী বৈশিষ্ট্য একই সময়ে চালানোর জন্য কোনও অন্লিকলিস্টার এড়ানোর জন্য স্থিতিশীল। (যদি ব্যবহারকারী অন্য বোতামে ক্লিক করেন) আপনি সহজেই আপনার অনক্লিকলিস্টনারকে এই শ্রেণিতে প্রতিস্থাপন করতে পারেন এবং অনক্লিক পদ্ধতি প্রয়োগের পরিবর্তে আপনাকে বিমূর্ত ওয়ানক্লিক () পদ্ধতিটি প্রয়োগ করতে হবে।

    abstract public class OneClickListener implements OnClickListener {

    private static boolean started = false;
    private static long lastClickEndTime = 0;

    /* (non-Javadoc)
     * @see android.view.View.OnClickListener#onClick(android.view.View)
     */
    @Override
    final public void onClick(final View v) {
        if(started || SystemClock.elapsedRealtime()-lastClickEndTime <1000 ){
            Log.d(OneClickListener.class.toString(), "Rejected double click, " + new Date().toString() );
            return; 
        }
        Log.d(OneClickListener.class.toString(), "One click, start: " + new Date().toString() );
        try{
            started = true;
            oneClick(v);
        }finally{
            started = false;
            lastClickEndTime = SystemClock.elapsedRealtime();
            Log.d(OneClickListener.class.toString(), "One click, end: " + new Date().toString() );
        }
    }

    abstract protected void oneClick(View v);
}

3

এটি সম্পন্ন করতে আপনি জ্যাক ওয়ার্টনের মাধ্যমে আরএক্স বাইন্ডিংগুলিও ব্যবহার করতে পারেন । এখানে এমন একটি নমুনা যা ধারাবাহিক ক্লিকের মধ্যে 2 সেকেন্ড প্যাড করে:

RxView.clicks(btnSave)
                .throttleFirst(2000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept( Object v) throws Exception {
//handle onclick event here
                });

// নোট: এই ক্ষেত্রে অবজেক্ট ভি উপেক্ষা করুন এবং আমি সবসময় মনে করি।


3

কোটলিন 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)
    }
}

বেসক্লাসে অন্য কোনও ফাংশন তৈরি করুন else

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

এবং বোতাম ক্লিক ক্লিক করুন

btnSubmit.setSafeOnClickListener {
    showSettingsScreen()
}

1
এক্সটেনশন সহ সবচেয়ে পরিষ্কার সমাধান! ধন্যবাদ!
অ্যান্ড্রয়েড_দেব



2

ক্লিকযোগ্যকে মিথ্যাতে সেট করা প্রথম ডাবল ক্লিকে কাজ করে না তবে পরবর্তী ডাবল ক্লিকগুলি অবরুদ্ধ করা হয়। এটি প্রথমবারের মতো লোডিং ক্লিক ডেলিগেট ধীর এবং দ্বিতীয় ক্লিকটি প্রথম সম্পূর্ণ হওয়ার আগে ধরা পড়ে before

        Button button = contentView.FindViewById<Button>(Resource.Id.buttonIssue);
        button.Clickable = false;
        IssueSelectedItems();
        button.Clickable = true;

2

আমি দুটি ক্লাস ব্যবহার করে এই সমস্যাটি সমাধান করেছি, একটি @ জিনশিআই ১১ জবাবের অনুরূপ এবং এনোটার সুস্পষ্ট ক্লিকের উপর ভিত্তি করে, আপনি কেবল একবার একবার বোতামে ক্লিক করতে পারেন, যদি আপনি অন্য ক্লিক চান তবে আপনাকে এটিকে স্পষ্টভাবে নির্দেশ করতে হবে ।

/**
 * Listener que sólo permite hacer click una vez, para poder hacer click
 * posteriormente se necesita indicar explicitamente.
 *
 * @author iberck
 */
public abstract class OnExplicitClickListener implements View.OnClickListener {

    // you can perform a click only once time
    private boolean canClick = true;

    @Override
    public synchronized void onClick(View v) {
        if (canClick) {
            canClick = false;
            onOneClick(v);
        }
    }

    public abstract void onOneClick(View v);

    public synchronized void enableClick() {
        canClick = true;
    }

    public synchronized void disableClick() {
        canClick = false;
    }
}

ব্যবহারের উদাহরণ:

OnExplicitClickListener clickListener = new OnExplicitClickListener() {
    public void onOneClick(View v) {
        Log.d("example", "explicit click");
        ...
        clickListener.enableClick();    
    }
}
button.setOnClickListener(clickListener);

2
final Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {

    private final AtomicBoolean onClickEnabled = new AtomicBoolean(true);

    @Override
    public void onClick(View v) {
        Log.i("TAG", "onClick begin");
        if (!onClickEnabled.compareAndSet(true, false)) {
            Log.i("TAG", "onClick not enabled");
            return;
        }

        button.setEnabled(false);

        // your action here

        button.setEnabled(true);
        onClickEnabled.set(true);
        Log.i("TAG", "onClick end");
    }
});

শ্রোতাদের দেখুন সর্বদা একক থ্রেডে (মূল) কল করা হয় তাই ব্যবহার করা AtomicBooleanসত্যিই সাহায্য করতে পারে না।
উইন্ডারাইডার

2

এটি চেষ্টা করুন, এটি কাজ করছে:

mButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

                mSlotLayout.setEnabled(false);

        //      do your work here

                Timer buttonTimer = new Timer();
                buttonTimer.schedule(new TimerTask() {

                    @Override
                    public void run() {

                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                mButton.setEnabled(true);
                            }
                        });
                    }
                }, 500); // delay button enable for 0.5 sec
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.