2010-07-27 17 views
34

Mon application de messagerie instantanée doit prendre en charge les émoticônes. Ce sont des GIF et des représentations textuelles, qui sont utilisées dans la boîte de saisie si l'utilisateur en sélectionne une. Mais je voudrais les afficher en tant qu'images après qu'ils ont été envoyés. Actuellement mon adaptateur de tableau personnalisé affiche le message envoyé dans un TextView d'une ligne.Afficher des émoticônes dans Android

Quelle est la méthode appropriée pour afficher les images dynamiquement en fonction de l'occurrence de leur représentation textuelle? Dois-je chercher des textes d'émoticônes, et si l'on trouve, enlever le TextView de la mise en page (relativeLayout s'adapte le plus?) Et ajouter un TextView avec le début de la messagerie instantanée, un ImageView avec l'émoticône et un autre TextView. Si plusieurs émoticônes sont envoyées simultanément, cela peut être désordonné.

Y a-t-il un moyen plus facile et plus logique?

+0

Je fais quelque chose de similaire ICI !!! http://stackoverflow.com/questions/16768930/implementations-of-emoji-emoticon-view-keyboard-layouts – toobsco42

Répondre

38

J'essaierais d'utiliser une expression régulière pour remplacer toutes les occurrences de chaque émoticon par une balise <img>. Ensuite, convertissez ce code HTML en SpannedStringvia Html.fromHtml(). Ce SpannedString peut être utilisé dans un appel setText() sur TextView.

+2

Ça marche, merci beaucoup! – Diepie

+0

Pouvez-vous s'il vous plaît aider à convertir ce "5794d5f7895fa10a8f8e1357" dans l'EMOJI .. S'il vous plaît aidez-moi @CommonWare ..Merci ... –

117

Je pense qu'il serait plus utile de construire Spannable.

private static final Factory spannableFactory = Spannable.Factory 
     .getInstance(); 

private static final Map<Pattern, Integer> emoticons = new HashMap<Pattern, Integer>(); 

static { 
    addPattern(emoticons, ":)", R.drawable.emo_im_happy); 
    addPattern(emoticons, ":-)", R.drawable.emo_im_happy); 
    // ... 
} 

private static void addPattern(Map<Pattern, Integer> map, String smile, 
     int resource) { 
    map.put(Pattern.compile(Pattern.quote(smile)), resource); 
} 

public static boolean addSmiles(Context context, Spannable spannable) { 
    boolean hasChanges = false; 
    for (Entry<Pattern, Integer> entry : emoticons.entrySet()) { 
     Matcher matcher = entry.getKey().matcher(spannable); 
     while (matcher.find()) { 
      boolean set = true; 
      for (ImageSpan span : spannable.getSpans(matcher.start(), 
        matcher.end(), ImageSpan.class)) 
       if (spannable.getSpanStart(span) >= matcher.start() 
         && spannable.getSpanEnd(span) <= matcher.end()) 
        spannable.removeSpan(span); 
       else { 
        set = false; 
        break; 
       } 
      if (set) { 
       hasChanges = true; 
       spannable.setSpan(new ImageSpan(context, entry.getValue()), 
         matcher.start(), matcher.end(), 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } 
    } 
    return hasChanges; 
} 

public static Spannable getSmiledText(Context context, CharSequence text) { 
    Spannable spannable = spannableFactory.newSpannable(text); 
    addSmiles(context, spannable); 
    return spannable; 
} 

Actuellement, ce code est basé sur les sources de la classe Html native.

Éditer: La version mise à jour a une amélioration spectaculaire de la vitesse.

+0

Salut a-iv pouvez-vous s'il vous plaît envoyez-moi un peu plus de code pour mieux vous comprendre. – amity

+0

Merci A-IV, votre code m'aider beaucoup. – amity

+12

+1 pour une réponse géniale. –