国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)教程之如何屏蔽View的重復點擊

2019-10-21 21:38:20
字體:
來源:轉載
供稿:網(wǎng)友

前言

android 防止重復點擊是一個非常常見的需求,每個人都有各自的點擊事件的處理習慣,有的喜歡使用匿名內(nèi)部類,有的activity、fragment、自定義View等繼承點擊事件然后在onClick()方法中根據(jù)id用switch實現(xiàn)各自View的點擊事件。

在開發(fā)中我們經(jīng)常需要這樣的需求,比如一個驗證碼發(fā)送按鈕,我們只想讓它響應500毫秒中的第一次點擊事件,該如何處理呢?你可能會說這個簡單,在點擊事件中獲取當前時間與上次的比較下,如果小于500毫秒就return掉。是的,這樣可以解決,但是如果現(xiàn)在整個項目的所有按鈕點擊事件都需要這樣的需求,該如何處理?不可能內(nèi)個點擊事件中都加入這幾行代碼吧。

這里先放上我寫的一個響應第一次點擊的工具類,可實現(xiàn)2種模式:

  • 第一種:無論點擊的哪個View,僅響應第一次點擊
  • 第二章:同一個View上僅響應第一次點擊,不同View間無影響
public class ClickHelper { private static long DELAY = 500L; private static long lastTime = 0L; private static List<Integer> viewIds = null; private static final int SAME_VIEW_SIZE = 10; private ClickHelper() { } public static void setDelay(long delay) {  ClickHelper.DELAY = delay; } public static long getDelay() {  return DELAY; } public static void onlyFirstIgnoreView(final View target, @NonNull final Callback callback) {  long nowTime = System.currentTimeMillis();  if (nowTime - lastTime > DELAY) {   callback.onClick(target);   lastTime = nowTime;  } } public static void onlyFirstSameView(final View target, @NonNull final Callback callback) {  long nowTime = System.currentTimeMillis();  int id = target.getId();  if (viewIds == null) {   viewIds = new ArrayList<>(SAME_VIEW_SIZE);  }  if (viewIds.contains(id)) {   if (nowTime - lastTime > DELAY) {    callback.onClick(target);    lastTime = nowTime;   }  } else {   if (viewIds.size() >= SAME_VIEW_SIZE) {    viewIds.remove(0);   }   viewIds.add(id);   callback.onClick(target);   lastTime = nowTime;  } } public interface Callback {  void onClick(View view); }}

那如何才能讓它對整個項目的所有點擊事件生效呢?我的解決辦法是這樣的。

第一步,繼承View.OnClickListener在onClick方法中調(diào)用工具類回調(diào)到抽象方法,項目中所有的點擊事件都去繼承這個抽象類

public abstract class OnFirstClickListener implements View.OnClickListener { @Override public final void onClick(final View v) {  ClickHelper.onlyFirstSameView(v, new ClickHelper.Callback() {   @Override   public void onClick(View view) {    onFirstClick(view);   }  }); } public abstract void onFirstClick(View v);}

第二步,在項目的BaseActivity中實現(xiàn)View.OnClickListener接口,在onClick方法中調(diào)用工具類,回調(diào)出屏蔽后的點擊事件,子類復寫onClickWithoutLogin或者onClickCheckLogin方法就可以了。至于為什么會有2個,看名字就知道了,一個驗證了用戶登錄狀態(tài),僅在登錄狀態(tài)響應事件,未登錄則跳轉登錄界面,多封裝了一層罷了。

/** * 用注解綁定點擊事件時,在該方法綁定 */@Overridepublic void onClick(final View v) {  ClickHelper.onlyFirstSameView(v, new ClickHelper.Callback() {    @Override    public void onClick(View view) {      if (!onClickWithoutLogin(view)) {        if (UserUtils.doIfLogin(getContext())) {          onClickCheckLogin(view);        }      }    }  });}/** * 不需要登錄的點擊事件 */public boolean onClickWithoutLogin(View v) {  return false;}/** * 必須登錄的點擊事件 * 如果已經(jīng)登錄直接執(zhí)行,沒有登錄時跳轉登錄界面 */public void onClickCheckLogin(View v) {}

以上只是個人開發(fā)中用到的,如果大家有更好的方法,歡迎留言討論。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 福安市| 河津市| 京山县| 榆社县| 玛沁县| 美姑县| 韶山市| 无极县| 东源县| 新晃| 社旗县| 黄平县| 宁蒗| 三明市| 昌乐县| 虞城县| 临沂市| 全椒县| 樟树市| 江山市| 文水县| 开江县| 滨州市| 尼木县| 会同县| 阜平县| 鄄城县| 三亚市| 营山县| 西贡区| 黔南| 牙克石市| 江北区| 云林县| 喜德县| 容城县| 乌兰浩特市| 泾川县| 石家庄市| 红原县| 汶川县|