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

Mam ten typ ciągu, który otrzymałem z EditTextbox. NOW chcę zastąpić wszystkie ":)" obrazami 1 i ": D" z image2.Chcę zrobić jak string.replaceall (":)", image1) i string.replaceall (": D", image2). Czy ktokolwiek może mi podpowiedzieć jak to zrobić z małym kodem, a także lepszą wydajnością. Mam napisz kod i działa dobrze, ale zajmuje dużo czasu.Zastąp znaki ciągiem, a następnie ustaw na widok tekstowy

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

'to działa fine' również tak co znowu było pytanie? – njzk2

+0

Potrzebuję lepszego rozwiązania, które zwiększy wydajność.To działa, ale zajmie dużo czasu bcz to sprawdzi postać po znaku. Więc potrzebuję lepszego rozwiązania – Nency

+0

wydaje się, że 'setSpan' jest najwolniejszą częścią ... Mam podobne problem z zastąpieniem koloru tła tekstu. – bancer

Odpowiedz

0

Wystarczy załadować obrazy wcześniej, nie w czasie wykonywania, załadować obrazy i zapisać w zmiennych i po prostu przypisać obrazy w czasie wykonywania. Znaki FYI nie są problemem, przeszedłem przez ten sam problem wcześniej i rozumiałem to jako problem punktów dotykowych, ale problem polegał na ładowaniu obrazów.

+0

czy możesz wyjaśnić, jak wczytać obraz wcześniej? Ustawiłem obrazy takie jak ten emoticons.put (":)", R.drawable.j1); emoticons.put (": D", R.drawable.j2); więc jak mogę zrobić? – Nency

+0

Bitmap bitmap = BitmapFactory.decodeResource (getResources(), R.drawable.j1); Bitmap bitmap1 = BitmapFactory.decodeResource (getResources(), R.drawable.j2); builder.setSpan (mapa bitowa, indeks, indeks + długość, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); Mam nadzieję, że to pomoże. – jay

+0

Możesz również umieścić ciąg i bitmapę w swojej mapie. – jay

0

Sprawdź to:

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; 
} 
Powiązane problemy