Handle SpannableStringBuilder image в android
Я разрабатываю приложение, в котором выбранные контакты добавляются к EditText
сизображением метки закрытия, и когда я нажимаю на это Изображение метки закрытия контакт должен быть удален. Я завершил код до отображения изображения метки закрытия, но я не знаю, как обращаться с этими изображениями метки закрытия. Пожалуйста, подскажите мне, как это сделать.
Мой код:
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;
}
2 ответа:
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
Не забудьте последнюю строку
Лучший способ сделать то, что вы пытаетесь сделать, - это использовать библиотеку AOSP* "official" Chips.
Например, когда вы начнете вводить номер в приложении sms по умолчанию, появится список возможных совпадающих контактов. Как только вы выберете контакт или номер совпадет с одним, то он превратится в "фишку", с кнопкой "x", чтобы удалить его из списка получателей.
Чтобы получить такое поведение, используйте эту библиотеку непосредственно из AOSP: https://android.googlesource.com/platform/frameworks/opt/chips/+ / мастер
Краткое объяснение можно найти здесь, у Романа Нурика, адвоката разработчиков Android, работающего в Google: https://plus.google.com/+RomanNurik / posts/WUd7GrfZfiZ
* AOSP расшифровывается как Android Open Source Project