最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年09月23日 09:24:49   作者:goweii  
這篇文章主要給大家介紹了關(guān)于Android開發(fā)教程之如何屏蔽View的重復(fù)點擊的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

  • 第一種:無論點擊的哪個View,僅響應(yīng)第一次點擊
  • 第二章:同一個View上僅響應(yīng)第一次點擊,不同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)出屏蔽后的點擊事件,子類復(fù)寫onClickWithoutLogin或者onClickCheckLogin方法就可以了。至于為什么會有2個,看名字就知道了,一個驗證了用戶登錄狀態(tài),僅在登錄狀態(tài)響應(yīng)事件,未登錄則跳轉(zhuǎn)登錄界面,多封裝了一層罷了。

/**
 * 用注解綁定點擊事件時,在該方法綁定
 */
@Override
public 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í)行,沒有登錄時跳轉(zhuǎn)登錄界面
 */
public void onClickCheckLogin(View v) {
}

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

總結(jié)

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

相關(guān)文章

最新評論

洪泽县| 游戏| 武定县| 山东| 香格里拉县| 夏津县| 桐城市| 沙湾县| 邢台县| 聊城市| 苍溪县| 双城市| 巩义市| 金平| 榆树市| 抚顺市| 新乡市| 会昌县| 江永县| 灵武市| 内黄县| 东阳市| 周宁县| 三门县| 卓资县| 鹰潭市| 图们市| 铜鼓县| 舒城县| 桃源县| 蒙自县| 霞浦县| 芷江| 蒲江县| 马山县| 临高县| 洱源县| 肥西县| 周至县| 蓬安县| 崇明县|