在安卓系统中处理SpannableStringBuilder图片

4
我正在开发一个应用程序,在其中选定的联系人将添加到EditText中,并带有关闭标记图像,当我单击该关闭标记图像时,该联系人应被删除。我已经完成了显示关闭标记图像的代码,但我不知道如何处理这些关闭标记图像。请建议我如何处理。 enter image description here 我的代码:
for (int i = 0; i < selectedItems.size(); i++) {
                    String na = selectedItems.get(i);
                    TextView tv = createContactTextView(na);
                    BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
                    bd.setBounds(0, 0, bd.getIntrinsicWidth(),
                            bd.getIntrinsicHeight());
                    sb.append(na + ",");
                    sb.setSpan(new ImageSpan(bd), sb.length()
                            - (na.length() + 1), sb.length() - 1,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }

                txt.setText(sb);

private Object convertViewToDrawable(TextView view) {
        int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        view.measure(spec, spec);
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),
                view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        c.translate(-view.getScrollX(), -view.getScrollY());
        view.draw(c);
        view.setDrawingCacheEnabled(true);
        Bitmap cacheBmp = view.getDrawingCache();
        Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
        view.destroyDrawingCache();
        return new BitmapDrawable(viewBmp);
    }

    private TextView createContactTextView(String text) {
        TextView tv = new TextView(this);
        tv.setText(text);
        tv.setTextSize(25);
        tv.setBackgroundResource(R.drawable.oval_small);
        tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.close, 0);
        return tv;
    }

使用您自定义的ClickableSpan和相同的start、end和flags参数调用sb.setSpan。 - pskink
不错的想法,谢谢。但是如何编写点击函数以操作 span(sb)? - NareshRavva
class MyClickableSpan extends ClickableSpan { ... - pskink
你能提供任何样例链接吗? - NareshRavva
sb.setSpan(new ClickableSpan() {@Override public void onClick(View widget) { Log.v("ClickableSpan", "ClickableSpan"); }}, sb.length() - (na.length() + 1), sb.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - NareshRavva
显示剩余2条评论
2个回答

6

ClickableSpan 可以满足你的需求:

for (int i = 0; i < selectedItems.size(); i++) {
     String na = selectedItems.get(i);
     TextView tv = createContactTextView(na);
     BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
     bd.setBounds(0, 0, bd.getIntrinsicWidth(),bd.getIntrinsicHeight());
     sb.append(na + ",");
     sb.setSpan(new ImageSpan(bd), sb.length()
          - (na.length() + 1), sb.length() - 1,
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

     final int index = i;  
     sb.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    // here add your code
                    // delete your selectedItems[index]
                    // recreate your SpannedString and set to txt
                }
            }, sb.length()
                    - (na.length() + 1), sb.length() - 1,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 }

 txt.setText(sb);
 txt.setMovementMethod(LinkMovementMethod.getInstance());  // important

不要忘记最后一行。

它正在工作,谢谢,但是当单击关闭符号时如何删除该字符串? - NareshRavva
@NareshRavva,你可以重新创建SpannableString并将其设置为TextView,我修改了我的答案。 - bladefury
最后一行的作用是什么? - NareshRavva
1
请参见https://dev59.com/P2oy5IYBdhLWcg3wScTb - bladefury

1
你想要做的最好的方式是使用AOSP官方的Chips库。例如,在默认短信应用程序中开始输入数字时,这将显示可能匹配的联系人列表。一旦选择了联系人或者号码匹配了一个联系人,则它将变成一个“芯片”,带有一个“x”按钮,以从接收者列表中删除它。
为了获得这种行为,请直接使用来自AOSP的此库: https://android.googlesource.com/platform/frameworks/opt/chips/+/master 可以在这里找到简要说明,由Roman Nurik提供,他是在Google工作的Android开发者倡导者: https://plus.google.com/+RomanNurik/posts/WUd7GrfZfiZ *AOSP代表Android开源项目

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接