J'essaie de créer des bulles de contact de la même MultiAutoCompleteTextView
manière que dans l'application Google+. Voici une capture d'écran:
.
J'ai essayé d'étendre la DynamicDrawableSpan
classe afin d'obtenir un dessin spannable en arrière-plan d'une étendue de texte
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;
}
}
Où mon dessinable oval.xml est défini comme suit:
<?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>
Dans ma classe d'activité qui a le MulitAutoCompleteTextView
, j'ai défini la durée de la bulle comme ceci:
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);
Cependant, au lieu de la forme ovale qui s'affiche derrière les 6 premiers caractères de la chaîne, les caractères ne sont pas visibles et il n'y a pas d'ovale dessinable en arrière-plan.
Si je change la méthode getDrawable () de BubbleSpan pour utiliser un .png au lieu d'une forme dessinable:
public Drawable getDrawable() {
Resources res = c.getResources();
Drawable d = res.getDrawable(android.R.drawable.bottom_bar);
d.setBounds(0, 0, 100, 20);
return d;
}
Ensuite, le .png apparaîtra mais les caractères de la chaîne qui font partie de la plage n'apparaîtront pas. Comment puis-je faire en sorte que les caractères de la plage soient affichés au premier plan, tandis qu'une forme personnalisée pouvant être dessinée s'affiche en arrière-plan?
J'ai essayé d'utiliser également un ImageSpan
au lieu de sous-classer, DynamicDrawableSpan
mais sans succès.
la source
Réponses:
Merci @chrish pour toute l'aide. Alors, voici comment je l'ai fait:
la source
BitmapDrawable bd = new BitmapDrawable(bitmap); bd.setBounds(0,0,bitmap.getWidth(), bitmap.getHeight());
cela fonctionne dans tous les appareils.Voici une solution complète pour vous
Voici le fichier de projet complet, si l'un d'entre vous souhaite utiliser Spannble
la source
J'ai une bibliothèque qui fait ce que vous cherchez avec:
Regardez ici
Voici un démarrage rapide:
Ajoutez ChipView à votre mise en page ou créez-le par programme:
Lancez-le avec une liste de données qui étendent la puce abstraite et un écouteur de clic (si vous le souhaitez):
ChipView par défaut est rendu comme ceci:
Mais vous pouvez personnaliser à votre guise du niveau global au niveau de la puce:
Ce n'est pas un MultiAutocomplete mais vous pouvez réussir à l'imiter (je l'utilise en fait comme ça)
la source