Ich versuche, Kontaktblasen zu erstellen, MultiAutoCompleteTextView
ähnlich wie sie in der Google+ App implementiert sind. Unten ist ein Screenshot:
.
Ich habe versucht, die DynamicDrawableSpan
Klasse zu erweitern, um eine spannbare Zeichnung im Hintergrund einer Textspanne zu erhalten
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;
}
}
Wo meine oval.xml drawable wie folgt definiert ist:
<?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>
In meiner Aktivitätsklasse mit dem habe MulitAutoCompleteTextView
ich die Blasenspanne wie folgt eingestellt:
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);
Anstelle der ovalen Form, die hinter den ersten 6 Zeichen in der Zeichenfolge angezeigt wird, sind die Zeichen jedoch nicht sichtbar und im Hintergrund kann kein Oval gezeichnet werden.
Wenn ich die getDrawable () -Methode von BubbleSpan so ändere, dass anstelle einer zeichnbaren Form eine PNG-Datei verwendet wird:
public Drawable getDrawable() {
Resources res = c.getResources();
Drawable d = res.getDrawable(android.R.drawable.bottom_bar);
d.setBounds(0, 0, 100, 20);
return d;
}
Dann wird die PNG-Datei angezeigt, aber die Zeichen in der Zeichenfolge, die Teil der Spanne sind, werden nicht angezeigt. Wie kann ich dafür sorgen, dass die Zeichen in der Spanne im Vordergrund angezeigt werden, während im Hintergrund eine benutzerdefinierte Form gezeichnet wird?
Ich habe versucht, ImageSpan
anstelle von auch eine Unterklasse zu verwenden DynamicDrawableSpan
, war jedoch nicht erfolgreich.
quelle
Antworten:
Danke @chrish für all die Hilfe. Also hier ist, wie ich es gemacht habe:
quelle
BitmapDrawable bd = new BitmapDrawable(bitmap); bd.setBounds(0,0,bitmap.getWidth(), bitmap.getHeight());
Das funktioniert auf allen Geräten.Hier ist eine Komplettlösung für Sie
Hier ist die vollständige Projektdatei, falls einer von Ihnen Spannble verwenden möchte
quelle
Ich habe eine Bibliothek, die das macht, wonach Sie suchen:
Schauen Sie hier
Hier ein Schnellstart:
Fügen Sie Ihrem Layout ChipView hinzu oder erstellen Sie es programmgesteuert:
Initiieren Sie es mit einer Liste von Daten, die den abstrakten Chip erweitern, und einem Klick-Listener (wenn Sie möchten):
Die Standard-ChipView wird folgendermaßen gerendert:
Sie können jedoch von der Gesamt- bis zur Chip-Ebene beliebig anpassen:
Dies ist kein MultiAutocomplete, aber Sie können es nachahmen (ich benutze es tatsächlich so).
quelle