真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中怎樣屏蔽View的重復(fù)點(diǎn)擊

小編給大家分享一下Android中怎樣屏蔽View的重復(fù)點(diǎn)擊,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有永州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

前言

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

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

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

  • 第一種:無(wú)論點(diǎn)擊的哪個(gè)View,僅響應(yīng)第一次點(diǎn)擊

  • 第二章:同一個(gè)View上僅響應(yīng)第一次點(diǎn)擊,不同View間無(wú)影響

public class ClickHelper {

 private static long DELAY = 500L;
 private static long lastTime = 0L;
 private static List 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);
 }
}

那如何才能讓它對(duì)整個(gè)項(xiàng)目的所有點(diǎn)擊事件生效呢?我的解決辦法是這樣的。

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

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);
}

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

/**
 * 用注解綁定點(diǎn)擊事件時(shí),在該方法綁定
 */
@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);
        }
      }
    }
  });
}

/**
 * 不需要登錄的點(diǎn)擊事件
 */
public boolean onClickWithoutLogin(View v) {
  return false;
}

/**
 * 必須登錄的點(diǎn)擊事件
 * 如果已經(jīng)登錄直接執(zhí)行,沒(méi)有登錄時(shí)跳轉(zhuǎn)登錄界面
 */
public void onClickCheckLogin(View v) {
}

以上是“Android中怎樣屏蔽View的重復(fù)點(diǎn)擊”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享名稱:Android中怎樣屏蔽View的重復(fù)點(diǎn)擊
網(wǎng)頁(yè)路徑:http://weahome.cn/article/ipijdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部