最近看到其他网上有写仿新浪微博插入话题这个功能,具体就是当用户输入"#"这个字符以后,会跳出一个选项让用户选择一个话题,然后在输入框中会显示#XX话题#,点击删除会一下把整个话题删除,而不是一个个删除,并且#XX话题#会变色。

我的想法,首先肯定是监听EditText的输入,当用户输入"#"之后,Activity就会跳转到选择话题的另外一个Activity,用户点击一个话题之后,通过onActivityResult这个回调函数拿到话题,至于怎么做到一下子把整个话题删除,变色这样的功能,我是把拿到的String转换成一个

首先是监听用户的输入:

et.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {//System.out.println( s.charAt(start));if(s.length() == start){}else{if("#".toCharArray()[0] == s.charAt(start)){AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);//Dialog dialog = builder.show();builder.setIcon(R.drawable.ic_launcher).setTitle("choose the topic!").setPositiveButton("ensure", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//dialog.dismiss();Intent intent = new Intent(MainActivity.this,ChooseActivity.class);startActivityForResult(intent, 1);}}).create().show();//System.out.println("equals");//Toast.makeText(MainActivity.this, "you input an a!!", Toast.LENGTH_SHORT).show();}}//System.out.println(start + " " + before);//System.out.println("the word you input this time:" + " " + s.charAt(start));}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {//System.out.println(count);//lastInputString = s.toString();}@Overridepublic void afterTextChanged(Editable s) {// TODO 自动生成的方法存根}});

接着是onActivityReslut这个回调函数:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if(requestCode == 1 && resultCode == 0){String topic = "#" + data.getExtras().getString("topic") + "#";et.insertTopic(topic);}super.onActivityResult(requestCode, resultCode, data);}

看到insertTopic这个函数,就应该知道我使用的EditText是自定义的,并且自己添加了这个方法。

下面是自定义的EditText:

public class MyEditText extends EditText {public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public MyEditText(Context context, AttributeSet attrs) {super(context, attrs);}public MyEditText(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}public void insertTopic(String topic){this.getText().delete(this.getText().length() - 1, this.getText().length());SpannableString ss = new SpannableString("[" + topic + "]");TopicDrawable td = new TopicDrawable(topic);td.setBounds(0, 0, td.getIntrinsicWidth(), td.getIntrinsicHeight());System.out.println(td.getIntrinsicHeight() + " " + td.getIntrinsicWidth());ImageSpan span = new ImageSpan(td, ImageSpan.ALIGN_BASELINE);ss.setSpan(span, 0, topic.length()+2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);int start = this.getSelectionStart();int end = this.getSelectionEnd();if(start == end){//System.out.println(et.getText().length());this.getText().insert(start, ss);}else{this.getText().replace(start, end, ss);}//System.out.println(start + ss.length());//System.out.println(getText().length());this.setSelection(start + ss.length());}}

将string转化成drawable,具体就是通过SpannableString和ImageSpan来实现的最后一句话是将EditText的光标设置到最后,大家可以去掉再看看是什么情况。

当然,TopicDrawable也是我自定义的。

public class TopicDrawable extends Drawable {private String topic;private Paint paint;public TopicDrawable(String topic){this.topic = topic;paint = new Paint();paint.setColor(Color.BLUE);paint.setTextSize(36);}@Overridepublic void draw(Canvas canvas) {canvas.drawText(topic, 0, 0, paint);}@Overridepublic void setAlpha(int alpha) {}@Overridepublic void setColorFilter(ColorFilter cf) {}@Overridepublic int getOpacity() {return 0;}@Overridepublic int getIntrinsicHeight() {return 0;}@Overridepublic int getIntrinsicWidth() {return (int) paint.measureText(topic);}
}

核心代码就是onDraw了,通过一个paint来控制颜色和字体大小。另外还有就是需要重写getIntrinsicHeight和getIntrinsicWidth这个两个函数,不然的话,EditText的光标是无法设置到正确的位置的。height直接返回0就可以,如果你返回的不是0(比如n),那么光标的位置就会相应的往下移n个具体,width的话,当然就是text的宽度了,使用paint的measureText就能很快的得到。

以上就是全部代码了,虽然很简单,不过其中也涵盖了不少的知识,其中有很多是比较细碎的,可以细细品味。

仿新浪微博的插入#话题#相关推荐

  1. android 仿微博评论编辑框_Android仿新浪微博加#话题的EditText实现

    需求 产品上线了,项目差不多算是稳定下来了,接下来就是一个个的版本迭代了.这周又增加了几个新功能,其中一个就是题目中讲的,要仿新浪微博(如下图)的输入框里的文字效果.作为整体的字体两边是井号,并且包括 ...

  2. 高仿SinaWeibo新浪微博发布页面话题效果

    最近做了一个仿新浪微博话题效果的功能,网上搜索了几个效果,都存在一定问题,最终借鉴别人的思路,完成这一套效果. 首先,我们拆分逻辑以及开发顺序. 1,实现话题变色效果 2,实现插入话题效果 3,实现话 ...

  3. android 微博字体高亮,安卓开发札记——高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现)...

    安卓开发笔记--高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现) 先让大家看下效果图,这个是我自己在闲暇时间仿写的新浪微博客户端: 今天来讲讲如何实现上图的效果,这里需要用到S ...

  4. 仿新浪微博客户端--界面设计(1)

    仿新浪微博客户端--界面设计(1) 2013年9月16日 新浪微博客户端继续开发 其实这些页面已经做好很久了,因为一直有其他事情要做,所以没太多时间发博客.关于新浪微博客户端的界面我想玩过微博的人都比 ...

  5. 仿新浪微博滚动,无文字渐显功能

    又一款仿新浪微博的文字滚动功能,去掉了滚动开始时候的文字渐显效果,似乎更明淅了,又一种风格的新浪微博大厅文字滚动,要的就复制代码吧. <!DOCTYPE HTML> <html la ...

  6. 新浪微博时间格式解析java_仿新浪微博格式化时间

    仿新浪微博格式化时间.现在项目中用到,适用于web项目等等,即时通信工具等用于显示时间试用. public static String getInterval(Date createAt) { // ...

  7. 新浪微博发布文章html,JS实现仿新浪微博发布内容为空时提示功能代码

    本文实例讲述了JS实现仿新浪微博发布内容为空时提示功能.分享给大家供大家参考.具体如下: 这里使用JavaScript模拟新浪微博的一个功能,在发布微博的内容为空时,文本框提醒用户这里没有输入内容,本 ...

  8. 短链接java代码_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java

    仿新浪微博 短链接地址生成工具 ShortUrlGenerator.java String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/ ...

  9. java 新浪短链接_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java | 学步园...

    仿新浪微博 短链接地址生成工具 ShortUrlGenerator.java String sLongUrl = "http://www.zuidaima.com/share/1550463 ...

最新文章

  1. GO语言初识(为go开发android做准备)
  2. cleanmymac3.9.6下载_单耳兔o2oapp下载-单耳兔o2o商城官方版下载v10.6 安卓版
  3. HTML5与CSS3实战指南读书笔记之一些可能会有用的东西
  4. Linux管道编程实例
  5. Android 基础概念了解
  6. 新浪微博搜索php待遇,新浪微博面试
  7. 【jeecg Docker安装】使用 Docker 搭建 Java Web 运行环境
  8. PyQt之按钮传递鼠标按下事件点击失效
  9. java学生管理系统oracle_基于Java的Oracle学生成绩管理系统
  10. 峰度和偏度在金融数据分析中有何应用_做数据分析,为什么要学统计学?
  11. idea导入项目后,没有项目结构
  12. 今日科技联播:全球区块链专利申请数超5000件,Coinplug第一阿里紧随其后
  13. 《中國哲學書電子化計劃》網頁文本處理[Word VBA]
  14. html 在线打开word文件,Html打开pdf、word、xls等文件
  15. Grafana——》重置默认的登录密码
  16. 如何设置局域网内的固定IP地址?
  17. java使用POI导出Excel,下拉列表联动,单元格合并,日期校验,锁定指定列禁止修改
  18. watch蜂窝开通服务器中断,原因找到了!Apple Watch Series 3为何无法连接蜂窝网络...
  19. [ZGC升级记录](to-space exhausted/Evacuation Failure)
  20. 佐治亚理工的网上计算机硕士,佐治亚理工计算机硕士读几年?

热门文章

  1. 变分推断(Variational Inference)解析
  2. 推荐一个svg转ico的在线网站(非常清晰)
  3. 电脑的windows键已被停用解决方法
  4. Linux内核PWN-基础ROP提权
  5. BI工具是什么,有什么用,怎么用?
  6. Adobe XD常见问题和解决方案
  7. Revit中创建基于线的砌体墙及【快速砌体排砖】
  8. 每日一词: 战略 2022.3.30
  9. GIS三维渲染引擎 到底有什么区别
  10. 用华为ENSP做一个关于防火墙的小实验-华为eNSP怎样调出右侧接口列表