精品视频在线免费观看_国产精品资源网_欧美日韩亚洲综合在线_自拍视频国产精品

原創(chuàng)生活

國內(nèi) 商業(yè) 滾動

基金 金融 股票

期貨金融

科技 行業(yè) 房產(chǎn)

銀行 公司 消費

生活滾動

保險 海外 觀察

財經(jīng) 生活 期貨

當前位置:滾動 >

hashtable源碼解析-JDK1.8 clipboard實現(xiàn)不同間復制粘貼

文章來源:財金網(wǎng)  發(fā)布時間: 2019-04-17 20:55:43  責任編輯:cfenews.com
+|-

【原標題:hashtable源碼解析-JDK1.8 clipboard實現(xiàn)不同間復制粘貼】財金網(wǎng)消息 前言

最近在寫項目的時候遇到了一個這樣的需求,要像qq一樣,點擊評論的者的名字要跳轉(zhuǎn)評論者的用戶信息界面,并且點擊評論信息中的web鏈接要跳轉(zhuǎn)到WebActivity,同時如果是其他數(shù)字的話要像qq一樣點擊并顯示底部Dialog提示是播打電話還是復制號碼。

效果

先給大家看看效果

下面的評論由一個TextView顯示,其實顯示為淡藍的都是可以點擊的區(qū)域。

思路

因為沒做過肯定是先百度了解一下,大部分的處理都是先設(shè)置TextView的autolink,然后系統(tǒng)會給你判斷TextView中是否可以匹配到鏈接。然后通過SpannableStringBuilder來設(shè)置點擊事件,當百度的部分有限,只能了解到web鏈接的點擊事件監(jiān)聽,所以我在此基礎(chǔ)上并綜合直接給TextView設(shè)置部分點擊的知識做了一些嘗試,但是出現(xiàn)了一些問題,就是當autolink設(shè)置的過濾在TextView中的文字中沒有匹配到的時候不能獲取到Spannable對象。我就自己new了一個,但是卻不能處罰點擊事件,最后找到了一個TextViewtv.setMovementMethod(LinkMovementMethod.getInstance());方法,設(shè)置之后才能觸發(fā)點擊事件。

實現(xiàn)步驟

首先給你的TextView設(shè)置autoLink屬性

如下

android:autoLink="all"

然后實現(xiàn)一個初始化web和數(shù)字鏈接點擊的監(jiān)聽,如下

public static SpannableStringBuilder getWebLinkStyle(CharSequence text, Context context) {    if (text instanceof Spannable) {      int end = text.length();      Spannable sp = (Spannable) text;      URLSpan urls[] = sp.getSpans(0, end, URLSpan.class);      SpannableStringBuilder style = new SpannableStringBuilder(text);      style.clearSpans();      for (URLSpan urlSpan : urls) {        ClickableSpan myURLSpan = new ClickableSpan() {          @Override          public void onClick(@NonNull View view) {            if (urlSpan.getURL().startsWith("http")) {              WebActivity.startWebBrowsing(context, urlSpan.getURL(), "");            } else {              String number = urlSpan.getURL();              if (number.contains(":")) {                number = number.split[1](":");              }              showBottomSheetDialog(context, number);            }          }        };        style.setSpan(myURLSpan, sp.getSpanStart(urlSpan),            sp.getSpanEnd(urlSpan),            Spannable.SPAN_EXCLUSIVE_INCLUSIVE);      }      return style;    }    return null;  } public static void showBottomSheetDialog(Context context, final String number) {    BottomSheetDialog dialog = new BottomSheetDialog(context);    View dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_bottom, null);    TextView tvTitle = dialogView.findViewById(R.id.tv_title);    tvTitle.setText(String.format("%s\n可能是一個電話號碼或者其他聯(lián)系方式,你可以", number));    TextView tvCall = dialogView.findViewById(R.id.tv_call);    tvCall.setOnClickListener(view -> {      Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + number));      context.startActivity(dialIntent);      dialog.dismiss();    });    TextView tvCopty = dialogView.findViewById(R.id.tv_copy);    tvCopty.setOnClickListener(view -> {      ClipboardManager copy =          (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);      copy.setText(number);      dialog.dismiss();      ToastHelper.toast("已復制到剪切板");    });    TextView tvCancel = dialogView.findViewById(R.id.tv_cancel);    tvCancel.setOnClickListener(view -> dialog.dismiss());    dialog.setContentView(dialogView);    dialog.show();  }

從這個代碼里面可以看到text instanceof Spannable成立的時候即TextView中包含符合autolink過濾的鏈接。我們可以通過URLSpan來找到對應(yīng)的鏈接。然后判斷是否為web鏈接和數(shù)字,如果是數(shù)字的話顯示彈窗,提示打電話或者復制。代碼如下,同理如果不成立則說明TextView不包含autolink過濾的鏈接。只能返回null,需要新建一個。

接下來就是評論用戶設(shè)置點擊事件了。TextPositionBean是記錄每一個評論者用戶名在TextView文字中開始和結(jié)束的位置,因為在給每個評論者名字加上點擊事件時需要給定點擊文字的范圍。style.setSpan(clickableSpan,textPositionBean.getStart(),textPositionBean.getEnd(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);這其中g(shù)etStart()和getEnd()就確定了點擊文字的范圍。

代碼如下

SpannableStringBuilder style = UiHelper.getWebLinkStyle(tvCommentInfo.getText(),context);    if (style == null){      style = new SpannableStringBuilder(stringBuilder.toString());    }    for (TextPositionBeantextPositionBean : textPositionBeans) {      ClickableSpan clickableSpan = new ClickableSpan() {        @Override        public void onClick(@NonNull View view) {          UserInfoActivity.goToUserInfoActivity(context,textPositionBean.getData());        }      };      style.setSpan(clickableSpan,textPositionBean.getStart(),textPositionBean.getEnd(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);      tvCommentInfo.setMovementMethod(LinkMovementMethod.getInstance());    }    tvCommentInfo.setText(style);

當不存在過濾條件的時候,我就自己手動獲取一個,然后根據(jù)之前紀錄的評論用戶的用戶名出現(xiàn)的位置,來添加點擊事件,并且激活點擊響應(yīng)。即可

如果需要BottomSheetDialog的布局文件可看如下代碼

專題首頁|財金網(wǎng)首頁

原創(chuàng)
新聞

精彩
互動

獨家
觀察

京ICP備2021034106號-38   營業(yè)執(zhí)照公示信息  財金網(wǎng)  版權(quán)所有  cfenews.com  投稿郵箱:362293157@qq.com  業(yè)務(wù)QQ:362293157立即發(fā)帖
主站蜘蛛池模板: 亚洲一区不卡在线| 欧美久久综合性欧美| 国产精品美女久久| 国产欧美日韩高清| 国产日韩久久| www.男人天堂网| 亚洲精品在线视频观看| 久久国产精品久久精品国产| 日韩欧美亚洲日产国产| 日本一区二区在线视频观看| 久久五月天婷婷| 国产欧美一区二区三区视频| 国产三级精品网站| 国产精品福利在线观看网址| 国产日韩欧美日韩大片| 国产精品香蕉国产| 日韩在线精品一区| 国产成人精品午夜| 亚洲福利av| 久久天天躁狠狠躁夜夜躁2014 | 日本一区二区三区在线视频| 天天爱天天做天天操| 国产精品黄色av| 久久精视频免费在线久久完整在线看| 亚洲人成网站在线播放2019| 日韩免费中文专区| 国产日韩中文字幕| 99在线视频首页| 欧美激情亚洲国产| 国产精品免费久久久| 国产精品网站免费| 伊人久久大香线蕉精品| 日韩欧美精品在线不卡| 欧美在线日韩精品| 久久天堂国产精品| 亚洲人成网站在线观看播放| 日本不卡一区| 久久人人爽人人爽人人片亚洲| 色综合久久久久无码专区| 欧美激情国产日韩| 欧美 日韩 国产精品|