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

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

Android如何實(shí)現(xiàn)仿微信@好友功能-創(chuàng)新互聯(lián)

這篇文章主要介紹Android如何實(shí)現(xiàn)仿微信@好友功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比江安網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式江安網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋江安地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。

先上個(gè)效果圖

Android如何實(shí)現(xiàn)仿微信@好友功能

就是這么個(gè)功能

1. 分析需求

輸入@跳轉(zhuǎn)到聯(lián)系人界面,選中一個(gè)或者多個(gè)好友返回到當(dāng)前界面

按退格鍵刪除整塊內(nèi)容

塊內(nèi)的內(nèi)容可編輯,編輯完了之后將不附帶@功能,只是單純的文字

2. 開始編碼

既然是文本輸入首先繼承EditText自定義一個(gè)控件

public class MsgEditText extends AppCompatEditText {
 public MsgEditText(Context context) {
  super(context);
 }
 public MsgEditText(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 public MsgEditText(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 }
}

到底從哪里開始入手呢,首先完成變成塊的需求,

無意中看到這個(gè)項(xiàng)目https://github.com/g707175425/CloudEditText ,他是這么寫的

 private void generateOneSpan(Spannable spannableString, UnSpanText unSpanText) {
  //生成一個(gè)TextView
  View spanView = getSpanView(getContext(),  unSpanText.showText.toString(), getMeasuredWidth());
  //再將TextView轉(zhuǎn)換為一個(gè)圖片
  BitmapDrawable bitmpaDrawable = (BitmapDrawable) UIUtils.convertViewToDrawable(spanView);
  bitmpaDrawable.setBounds(0, 0, bitmpaDrawable.getIntrinsicWidth(), bitmpaDrawable.getIntrinsicHeight());
  //最后將這個(gè)圖片放到Span里,
  MyImageSpan what = new MyImageSpan(bitmpaDrawable, unSpanText.showText.toString(),unSpanText.returnText);
  final int start = unSpanText.start;
  final int end = unSpanText.end;
  spannableString.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  //設(shè)置一個(gè)Span
  spannableString.setSpan(touchableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 }

看到這里我們就記得了一個(gè)關(guān)于SpanableString的用法,它可以設(shè)置圖片,可以隨意的設(shè)置文字的背景的前景,等等一系列比較酷炫的效果,而且只需要一個(gè)TextView,如果需要深入了解Span,可自行百度和Google,關(guān)于Span的進(jìn)階用法,于是就有了下面的實(shí)現(xiàn)

//這個(gè)是需要成塊刪除的內(nèi)容
 private class MyTextSpan extends MetricAffectingSpan {
  private String showText;
  private long userId;
  //userId是為了適應(yīng)需求,如果不需要請(qǐng)自行去掉
  public MyTextSpan(String showText, long userId) {
   this.showText = showText;
   this.userId = userId;
  }
  public String getShowText() {
   return showText;
  }
  public long getUserId() {
   return userId;
  }
  @Override
  public void updateMeasureState(TextPaint p) {
  }
  @Override
  public void updateDrawState(TextPaint tp) {
  }
 }
 //這個(gè)是非整塊刪除的內(nèi)容,當(dāng)然你如果想也是可以刪除的
 private class UnSpanText {
  int start;
  int end;
  String returnText;
  UnSpanText(int start, int end, String returnText) {
   this.start = start;
   this.end = end;
   this.returnText = returnText;
  }
 }

剛開始我是這么寫的

//外部調(diào)用一個(gè)增加Span的方法
 public void addSpan(String showText, String returnText, long userId) {
  getText().append(showText);
  SpannableString spannableString = new SpannableString(getText());
  makeSpan(spannableString, new UnSpanText(spannableString.length() - showText.length(), spannableString.length(), showText, returnText), userId);
  setText(spannableString);
  setSelection(spannableString.length());
 }
 //生成一個(gè)需要整體刪除的Span
 private void makeSpan(Spannable sps, UnSpanText unSpanText, long userId) {
  MyTextSpan what = new MyTextSpan(unSpanText.returnText, userId);
  int start = unSpanText.start;
  int end = unSpanText.end;
  sps.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 }

寫到現(xiàn)在這個(gè)整塊添加已經(jīng)做好了,下面開始做整塊刪除,剛開始的時(shí)候我是模仿上面的CloudEditText寫的,但我發(fā)現(xiàn)好像會(huì)用各種問題,于是想了一種方法

 @Override
 protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
  super.onTextChanged(text, start, lengthBefore, lengthAfter);
  //向前刪除一個(gè)字符,@后的內(nèi)容必須大于一個(gè)字符,可以在后面加一個(gè)空格
  if (lengthBefore == 1 && lengthAfter == 0) {
   MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class);
   for (MyTextSpan myImageSpan : spans) {
    if (getText().getSpanEnd(myImageSpan) == start && !text.toString().endsWith(myImageSpan.getShowText())) {
     getText().delete(getText().getSpanStart(myImageSpan), getText().getSpanEnd(myImageSpan));
     break;
    }
   }
  }
 }

上面的意思就是,如果你在EditText中執(zhí)行刪除一個(gè)字符的時(shí)候,判斷前面一個(gè)是否是一個(gè)Span,如果是自定義的Span就把Span一同刪除,關(guān)于這個(gè),我可是測試可各種操作才定為這樣的

最后是獲取需要@的人員名單

 //獲取用戶Id列表,這只是個(gè)參考,可根據(jù)需求修改
 public String getUserIdString() {
  MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class);
  StringBuilder builder = new StringBuilder();
  for (MyTextSpan myTextSpan : spans) {
   String realText = getText().toString().substring(getText().getSpanStart(myTextSpan), getText().getSpanEnd(myTextSpan));
   String showText = myTextSpan.getShowText();
   if (realText.equals(showText)) {
    builder.append(myTextSpan.getUserId()).append(",");
   }
  }
  if (!TextUtils.isEmpty(builder.toString())) {
   builder.deleteCharAt(builder.length() - 1);
  }
  return builder.toString();
 }

以上是“Android如何實(shí)現(xiàn)仿微信@好友功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)頁名稱:Android如何實(shí)現(xiàn)仿微信@好友功能-創(chuàng)新互聯(lián)
文章來源:http://weahome.cn/article/pchpd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部