65 Stimmen

SpannableString mit Bild Beispiel

Ich suche nach einem Beispiel, wie man Android SpannableString mit ImageSpan erstellen und anzeigen kann. Etwas ähnliches wie die Inline-Anzeige von Smileys.

Vielen Dank.

133voto

Asahi Punkte 13158

Ich habe das Folgende gefunden und es scheint zu funktionieren:

public class TestActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    TextView textView  = (TextView) findViewById(R.id.textview); 
    SpannableString ss = new SpannableString("abc"); 
    Drawable d = ContextCompat.getDrawable(this, R.drawable.icon32);
    d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
    ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); 
    ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
    textView.setText(ss); 
}

20voto

Dedkov Vadim Punkte 402

SpannableString + ImageSpan funktionieren nicht in Android API 21 & 22 (Ich habe es in Android Studio 1.2.1.1 im Emulator getestet), aber wenn du dies tust:

TextView textView  = (TextView) findViewById(R.id.textview);
textView.setTransformationMethod(null);
...
textView.setText(ss); 

SpannableString + ImageSpan wird funktionieren.

Ich wurde von diesem Beitrag inspiriert: https://stackoverflow.com/a/26959656/3706042

0voto

matmacci Punkte 41

Wenn noch Interesse besteht, habe ich eine Java-Methode erstellt, um rekursiv aufgelistete Zeichenfolgen einem Text hinzuzufügen (der am Ende auf einen textView gesetzt wird) basierend auf einer "Zeichenfolge zum Ersetzen".

public void appendImages(@NonNull TextView textView,
                           @NonNull String text,
                           @NonNull String toReplace,
                           Drawable... drawables){
    if(drawables != null && drawables.length > 0){
        //Liste der übereinstimmenden Positionen, falls vorhanden
        List positions = new ArrayList<>();
        int index = text.indexOf(toReplace);
        while (index >= 0) {
            //Position hinzufügen
            positions.add(index);
            index = text.indexOf(toReplace, index + toReplace.length());
        }
        if(positions.size() > 0 && drawables.length >= positions.size()){
            textView.setTransformationMethod(null);
            SpannableString ss = new SpannableString(text);
            int drawablesIndex = 0;
            for(int position : positions){
                Drawable drawable = drawables[drawablesIndex++];
                //Erforderlich für Zeichenfolgen
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                ss.setSpan(new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE), position, position+toReplace.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            }
            textView.setText(ss);
        }
        else Timber.w("Die Anzahl der zu ersetzenden Übereinstimmungen beträgt %s und die Anzahl der anzuwendenden Zeichenfolgen beträgt %s", positions.size(), drawables.length);
    }
    else Timber.w("Das Array der Zeichenfolgen ist null oder leer.");
}

Verwendung:

appendImages(myTextView, "Dies ist ein ^ einfacher ^ Test", "^", drawable1, drawable2);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X