2012-10-09 21 views
9
This is :) and want to :) replace with :D new image. 

Tengo este tipo de cadena que tengo de EditTextbox.NOw quiero reemplazar todo ":)" con image1 y ": D" con imagen2.Quiero hacer como string.replaceall (":)", image1) y string.replaceall (": D", image2). Así que alguien me puede sugerir cómo hacer esto con un código pequeño y también un mejor rendimiento. Tengo escriba el código y también funciona bien, pero lleva mucho tiempo.Reemplazar los caracteres con Imagen en cadena y luego establecer en Textview

textview.setText(getSmiledText(ctx, stringvalue)); 
private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>(); 
    static { 
     emoticons.put(":)", R.drawable.j1); 
     emoticons.put(":D", R.drawable.j2);} 

public static Spannable getSmiledText(Context context, String s) { 
     int index; 
     SpannableStringBuilder builder = new SpannableStringBuilder(); 
     builder.append(s); 

     for (index = 0; index < builder.length(); index++) { 
      for (Entry<String, Integer> entry : emoticons.entrySet()) { 
       int length = entry.getKey().length(); 
       if (index + length > builder.length()) 
        continue; 
       if (builder.subSequence(index, index + length).toString() 
         .equals(entry.getKey())) { 
        builder.setSpan(new ImageSpan(context, entry.getValue()), 
          index, index + length, 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
        index += length - 1; 
        break; 
       } 
      } 
     } 
     return builder; 
    } 
+0

'se está trabajando también fine' así que lo que era la pregunta? – njzk2

+0

necesito la mejor solución que aumentará el rendimiento. Esto está funcionando pero lleva mucho tiempo bcz comprobará carácter por carácter. Así que necesito una mejor solución – Nency

+0

parece que 'setSpan' es la parte más lenta ... Tengo la similar problema con la sustitución del color de fondo del texto. – bancer

Respuesta

0

Lo que hay que hacer es cargar las imágenes no antes en tiempo de ejecución, cargar imágenes y guardar en las variables y simplemente asignar las imágenes en tiempo de ejecución. Los personajes FYI no son el problema, ya pasé por el mismo problema lo entendí como un problema de puntos táctiles, pero el problema era la carga de imágenes.

+0

¿Puedes explicar más cómo cargar la imagen previamente? He configurado las imágenes como este emoticons.put (":)", R.drawable.j1); emoticons.put (": D", R.drawable.j2); Entonces, ¿cómo puedo hacer? – Nency

+0

Bitmap bitmap = BitmapFactory.decodeResource (getResources(), R.drawable.j1); Bitmap bitmap1 = BitmapFactory.decodeResource (getResources(), R.drawable.j2); builder.setSpan (mapa de bits, índice, índice + longitud, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); Espero que esto ayude. – jay

+0

También puede poner cadena y mapa de bits en su hashmap. – jay

0

Comprobar esto:

public static Spannable getSmiledText(Context context, String s) 
    { 
    int index; 
    SpannableStringBuilder builder = new SpannableStringBuilder(); 
    builder.append(s); 

    for (Entry<String, Integer> entry : EmoticonsCode.emoticons_code.entrySet()) 
    { 
     try { 
      int length = entry.getKey().length(); 
      for (index = s.indexOf(entry.getKey()); index >= 0; index = s.indexOf(entry.getKey(), index + 1)) 
      { 
       System.out.println(index); 
       builder.setSpan(new ImageSpan(context, entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    return builder; 
} 
Cuestiones relacionadas