Android防止雙擊/多次點擊,多次點擊啟動多個相同界面的問題

在項目我們通常會遇到一個問題,如果用戶快速點擊時候,會重復打開多個界面,雖然大部分情況下不會影響使用,但是還是會給用戶造成不良的使用感受,下面將會介紹一些簡單的處理方式,針對不同的場景進行不同的使用


1. 我自己在用的防止創(chuàng)建多界面的方法,因為防止雙擊主要是防止activity被重復創(chuàng)建,我們一般都會在項目中定義BaseActivity和BaseFragment類,所以我想到通過直接重寫這兩個類中的startActivity方法來解決重復創(chuàng)建的方法

重寫基類中的startActivityForResult方法,因為startActivity最終調用的都是這個方法,并且在onResume中對clickable進行置為true,如果是Basefragment需要在setUserVisibleHint方法中對clickable進行重置true

Activity啟動源碼分析

boolean clickable = true;
    /**
     * 當前是否可以點擊
     * @return
     */
    protected Boolean isClickable() {
        return clickable;
    }

    /**
     * 鎖定點擊
     */
    protected void lockClick() {
        clickable = false;
    }
    
    
    @Override
    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (isClickable()) {
            lockClick();
            super.startActivityForResult(intent, requestCode, options);
        }
    }

BaseActivity中

  @Override
    protected void onResume() {
        super.onResume();
        clickable = true;
    }

BaseFragment中

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
           clickable = true;
    }

2. 雙擊時間檢測,針對單個按鈕

private long mLastClickTime = 0;
public static final long TIME_INTERVAL = 1000L;
private Button btTest;
private void initView() {
    btTest = findViewById(R.id.bt_test);
    btTest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            long nowTime = System.currentTimeMillis();
            if (nowTime - mLastClickTime > TIME_INTERVAL) {
                // do something
                mLastClickTime = nowTime;
            } else {
                Toast.makeText(MainActivity.this, "不要重復點擊", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

代碼中使用

/**
     * 點擊事件
     */
    private View.OnClickListener logListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (!NoDoubleClickUtils.isDoubleClick()) {
                事件響應方法
            }
        }
    };

3. 設置Activity的加載模式為 SingleTop

如果了解SingleTop模式就會知道SingleTop可以防止棧頂?shù)腁ctivity被重復的創(chuàng)建。但是如果界面可以自己跳轉到自己,就不能使用這種方法

4. 利用rxBinding 中的 rxView來解決,需要引入rxbinding第三方庫

RxView.clicks(view)
    .throttleFirst(1, TimeUnit.SECONDS)
    .subscribe(new Consumer<Object>() {
        @Override
        public void accept(Object o) throws Exception {
            // do something
        }
     });

響應式解決

5. AOP技術

AOP技術,原理類似第一種方式,但是利用注解實現(xiàn)更為方便

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • (兩年前的文章)原作者沒有署名,在此標明轉載文章,源自QQ空間日志,侵刪 1:主板故障 2:顯卡故障 3:聲卡故障...
    aclihui閱讀 2,307評論 0 10
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,311評論 0 10
  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,678評論 1 11
  • 在讀這本書之前,對稻盛和夫先生我是一點都不了解的,是的,我這個學渣幡然醒悟終于開始學習了,開始試著去學習,去了解成...
    心月月閱讀 1,395評論 0 0
  • 問:婆婆與兒媳婦的關系如何? 婆婆:果然是別人家娶進來的,不親。 兒媳婦:畢竟不是親媽,要求多,不好處。 未婚仙女...
    戈多的理想國閱讀 453評論 2 5

友情鏈接更多精彩內容