Staram się tworzyć bąbelki kontaktów w sposób MultiAutoCompleteTextView
podobny do tego, jak jest to zaimplementowane w aplikacji Google+. Poniżej zrzut ekranu:
.
Próbowałem rozszerzyć DynamicDrawableSpan
klasę, aby uzyskać spanable do rysowania w tle zakresu tekstu
public class BubbleSpan extends DynamicDrawableSpan {
private Context c;
public BubbleSpan(Context context) {
super();
c = context;
}
@Override
public Drawable getDrawable() {
Resources res = c.getResources();
Drawable d = res.getDrawable(R.drawable.oval);
d.setBounds(0, 0, 100, 20);
return d;
}
}
Gdzie mój plik do rysowania oval.xml jest zdefiniowany w następujący sposób:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#352765"/>
<padding android:left="7dp" android:top="7dp"
android:right="7dp" android:bottom="7dp" />
<corners android:radius="6dp" />
</shape>
W mojej klasie Activity, która ma MulitAutoCompleteTextView
, ustawiam zakres bąbelków w następujący sposób:
final Editable e = tv.getEditableText();
final SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append("some sample text");
sb.setSpan(new BubbleSpan(getApplicationContext()), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
e.append(sb);
Jednak zamiast owalnego kształtu wyświetlanego za pierwszymi 6 znakami w ciągu, znaki nie są widoczne i nie ma owalu, który można narysować w tle.
Jeśli zmienię metodę getDrawable () metody BubbleSpan, aby używała pliku .png zamiast kształtu możliwego do rysowania:
public Drawable getDrawable() {
Resources res = c.getResources();
Drawable d = res.getDrawable(android.R.drawable.bottom_bar);
d.setBounds(0, 0, 100, 20);
return d;
}
Następnie pojawi się .png, ale znaki w ciągu, które są częścią zakresu, nie pojawią się. Jak mogę to zrobić, aby znaki w zakresie były wyświetlane na pierwszym planie, podczas gdy niestandardowy kształt do rysowania jest wyświetlany w tle?
Próbowałem również użyć ImageSpan
zamiast podklasy, DynamicDrawableSpan
ale nie powiodło się.