Android图文混排功能(文字后面追加图片)

这几天比较闲,将前段时间项目中的一些功能整理下,做个备份,以备以后继续使用。

产品设计了一个页面,刚开始看到的时候没注意,做的时候才发现有问题!


图上的位置有一个图标按钮,需求是点击的时候,可以进行一部分编辑。

问题出来了,我本身准备用最简单的ImageView,直接开撸……but……

我撸了几行,突然想起来不行,因为我的地址是变动的,string的长度有可能是一行,2行……但是要求是这个图标必须是在文字的最后!!!

好吧,网上扒了下,有让用textview本身的drawableEnd属性的,但是我想了下,感觉肯定不符合需求。

这个时候,我想起来了本文的猪脚----SpannableString!!!

废话不多说,这里上关键代码!

SpannableStringspannableString =new SpannableString(holder.tv_send_address.getText());//textView控件
Drawabledrawable =getResources().getDrawable(R.mipmap.modifyadd);//这里放你需要添加到文字中间的image
drawable.setBounds(5,5,30,30);//左上右下
ImageSpanimageSpan = newImageSpan(drawable);
spannableString.setSpan(imageSpan,holder.tv_send_address.getText().length()-2,holder.tv_send_address.getText().length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//注意这里的字符串长度,我项目需求是图片添加到最后,但是SpannableString没有放在最后的方法,所以我在字符串的长度后面加了2空格  这样就能放最后了
holder.tv_send_address.setText(spannableString);


以上完成了功能1,就是图片的显示,但是最主要的需求是功能点击,如果不能点击的话  那就没意义了。

这里对这个编辑的图片 的点击操作  方案有2种:
1.一种是自定义一个可以点击的ClickableImageSpan(自己百度)
2.
clickSpanImageSpan重叠,这样用户其实点击的是一个ClickSpan,把代码放到ClickSpan的点击中操作就行

我在这里使用第二种方案!!!

废话不多说,接着上面的代码往下c&v就行

/** * 以下为混排之后的图片点击事件的方案处理*/
 final int start = spannableString.getSpanStart(imageSpan);
 final int end = spannableString.getSpanEnd(imageSpan);
ClickableSpan clickableSpan = new ClickableSpan() {
                    @Override
                    public void onClick(View widget) {
  //在这里的点击事件中你可以做你需要的操作了                      ToastUtils.showToast(getActivity(),"点击了编辑地址的操作")}
};
   ClickableSpan[] clickable_spans = spannableString.getSpans(start, end, ClickableSpan.class);
                if (clickable_spans.length != 0 ){
                    for (ClickableSpan c_span : clickable_spans) {
                        spannableString.removeSpan(c_span);
                    }
                }
                spannableString.setSpan(clickableSpan, start,end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                holder.tv_send_address.setText("");
                holder.tv_send_address.append(spannableString);
//                holder.tv_send_address.append(textstr);
              holder.tv_send_address.setMovementMethod(LinkMovementMethod.getInstance());

最后,来一张效果图吧!



补充:ImageSpan 有多个构造,其中有一个2个参数的构造,


这里面的int参数 如果是就是指的文字和图片对齐的方式,具体可以参考源码!

我项目中的需求是底部对齐,因此我在new ImageSpan的时候,传入的int参数是1。



你可能感兴趣的:(项目功能)