Android 按鈕重復(fù)點擊處理<一行代碼解決>.
Android hook插入自定義ClickListener, 完全無入侵.
github地址: https://github.com/liys666666/DoubleClick
DoubleClick---3.0版本
DoubleClick---2.0版本
DoubleClick---1.0版本
介紹
如果之前沒看過1.0版本的, 可以考慮先看背景介紹
一. 基本使用
① 導(dǎo)入框架
//項目根目錄下,build.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' } //添加
}
}
//app目錄下build.gradle
dependencies {
implementation 'com.github.liys666666:DoubleClick:V2.0.6' //添加
}
② 自定義的Application初始化即可
public class AppApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
// ViewDoubleHelper.init(this); //默認時間:1秒
ViewDoubleHelper.init(this, 500); //自定義間隔時間(單位:毫秒)
}
}
如果不需要其它的功能, 到這里就解決了. (和1.0版本一樣)
二. 特殊要求處理-----和1.0版本有區(qū)別
- 如果某個Activity里不需要處理重復(fù)點擊事件, 怎么辦?
- 只有一部分按鈕需要處理重復(fù)點擊, 怎么辦?
方法如下:
1. 定義一個接口UnifiedDoubleClick(名字隨意).
2. UnifiedDoubleClick里定義方法, 方法名隨意, 用注解解決.
3. 注解的意思
@ACancelActivity: 不需要處理重復(fù)點擊的Activity.
@AAddDoubleClick: 單獨處理DoubleClick的控件(如果有多個Activity, 只需定義多個方法即可)
activity: view所在的Acticity
addIds: View的id
times: Click最小間隔時間. 如果times=0, 那View就不需要處理重復(fù)點擊事件.
//初始化時使用這個方法
ViewDoubleHelper.init(this, 1000, UnifiedDoubleClick.class); //自定義間隔時間(單位:毫秒)
//或者 (不同的AnnotationClass會疊加)
//ViewDoubleHelper.addAnnotationClass(UnifiedDoubleClick.class);
public interface UnifiedDoubleClick{
//不需要處理重復(fù)點擊的Activity.
@ACancelActivity(activitys = {
MainActivity.class,
MainActivity2.class,
})
void cancelActivity();
//單獨處理DoubleClick的View
@AAddDoubleClick(activity = MainActivity.class,
addIds = {R.id.btn1, R.id.btn2},
times = {0, 2000})
void mainActivity();
@AAddDoubleClick(activity = MainActivity2.class,
addIds = {R.id.btn, R.id.btn2},
times = {2000, 2000})
void mainActivity2();
}
三. 插入自定義ClickListener(經(jīng)常用到) ----- 和1.0版本有區(qū)別
常見場景: 判斷是否登錄. 一個App會有很多個地方點擊時, 需要判斷是否登錄, 這個時候, 我們需要在很多地方寫if判斷.
使用這個框架: 你可以不用在原來的頁面判斷是否登陸, 直接寫正常邏輯就好了.
當然了, 用AOP也能達到這個效果, 不過你得引入AOP環(huán)境, 還得學(xué)一下AOP那幾個注解的使用, 我感覺還是挺麻煩的.
使用方法: 判斷是否登錄為例子
①. 定義一個類, 繼承BaseClickListener
public class LoginClickListener extends BaseClickListener{
public static boolean isLogin = false; //模擬是否登陸
@Override
public boolean isNext(View v) {
//判斷登錄邏輯 (onClick前執(zhí)行)
return isLogin; //true繼續(xù)執(zhí)行onClick, false不再執(zhí)行
}
@Override
public void after(View view) {
//onClick后 執(zhí)行
}
}
②.使用@AClickListener
activity: view所在的Acticity
lisenner : 插入的自定義ClickListener
ids: View的id
public interface UnifiedDoubleClick{
//....
@AClickListener(activity = MainActivity2.class,
lisenner = LoginClickListener.class,
ids = {R.id.btn, R.id.btn2})
void interceptMain2(); //方法名隨意
//記得初始化時使用:
ViewDoubleHelper.init(this, 1000, UnifiedDoubleClick.class); //自定義間隔時間(單位:毫秒)
效果: 在MainActivity2里, 點擊btn和btn2時, 如果已經(jīng)登錄, 則執(zhí)行它們的onClick方法, 否則, 不執(zhí)行.
綜上所述:
1. 如果只是基礎(chǔ)運用, 直接一行代碼解決.
// ViewDoubleHelper.init(this); //默認時間:1秒
ViewDoubleHelper.init(this, 500); //自定義間隔時間(單位:毫秒)
2. 如果特殊需求, 使用自定義UnifiedDoubleClick配合注解, 初始化時如下:
ViewDoubleHelper.init(this, 1000, UnifiedDoubleClick.class); //自定義間隔時間(單位:毫秒)
- @ACancelActivity: 不需要處理重復(fù)點擊的Activity.
- @AAddDoubleClick: 單獨處理DoubleClick的控件(如果有多個Activity用到, 只需定義多個方法即可)
- @AClickListener: 插入自定義ClickListener(如果有多個Activity用到, 只需定義多個方法即可)
- 優(yōu)點: 無論做什么處理, 對原來的代碼完全無入侵, 可以隨意增刪改.
到這里就結(jié)束了, 希望能幫到有需要的人, 如果覺得好用, 歡迎star.
技術(shù)有限, 如果框架中存在什么問題, 歡迎在下載評論區(qū)留言.