2015-08-27 6 views
7

Ich habe diese Funktion, die auf Android 4.4.1 funktioniert, aber bricht 5.0+.ImageSpan funktioniert nicht auf Android 5

public static SpannableStringBuilder prependImage(Drawable drawable, String text) { 
    SpannableStringBuilder builder = new SpannableStringBuilder(" " + text); 
    builder.setSpan(new ImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    return builder; 
    } 

Und ich benutze es wie folgt aus:

class MyButton extends Button { 

    // ... snip ... 

    setText(
     prependImage(
      getDrawable(imageResource, color),      
      getContext().getString(stringResource)), 
     BufferType.SPANNABLE); 

Hier ist die getDrawable() Methode oben verwiesen:

private Drawable getDrawable(int resource, int color) { 
    final Resources resources = getContext().getResources(); 
    Drawable drawable = resources.getDrawable(resource); 
    if (drawable != null) { 
     drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    } 
    return drawable; 
    } 

Wenn ich debuggen, alles scheint erfolgreich zu sein, aber kein Bild gezeichnet wird . Irgendwelche Ideen, was ich falsch machen könnte?

+0

ich eine Klasse erstellt, dass 'erweitert android.widget.Button', versucht, Ihre' prependImage (Drawable, String) 'Methode auf dem Emulator mit KitKat und das Bild war * nicht * gezeichnet. –

+0

Nun, es sollte einen Weg geben, um beides zu erreichen. Ich bin vollkommen glücklich, das wegzuwerfen und etwas anderes zu machen. Haben Sie sichergestellt, dass Sie die Grenzen des Zeichensatzes auf etwas anderes als 0,0,0,0 setzen? –

+0

@i_am_jorf Sie könnten 'TextView' anstelle von' Button' verwenden. Es scheint mit 'TextView' in allen Android-Versionen gut zu funktionieren. –

Antwort

3

Ihr Code im Zusammenhang mit mit Spannables arbeiten in Ordnung ist. Sie können es überprüfen, indem Sie Text für TextView festlegen.

Das Problem liegt im Material Design der Schaltfläche auf Android 5.0.

<style name="Widget.Material.Button"> 
    <item name="background">@drawable/btn_default_material</item> 
    <item name="textAppearance">?attr/textAppearanceButton</item> 
    <item name="minHeight">48dip</item> 
    <item name="minWidth">88dip</item> 
    <item name="stateListAnimator">@anim/button_state_list_anim_material</item> 
    <item name="focusable">true</item> 
    <item name="clickable">true</item> 
    <item name="gravity">center_vertical|center_horizontal</item> 
</style> 

Es gibt zwei Lösungen.

Die erste ist nur TextView als Ihre Schaltfläche und setText mit Bild zu verwenden.

Zum anderen (und möglicherweise mehr richtig) Sie benötigen Knopfart (Widget.Material.Button) in der nächsten Art und Weise zu erweitern:

<style name="BtnStyle" parent="android:Widget.Material.Button"> 
    <item name="android:textAppearance">@null</item> 
</style> 

Dann in Ihrem Layout:

<Button 
    android:id="@+id/test2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Test" 
    style="@style/BtnStyle"/> 

Nachdem Sie tun Sie sollten die Bilder in der Schaltfläche sehen.

Vergessen Sie nicht für Android-Version, die niedriger als 5.0 ist, sollten Sie auch BtnStyle erstellen, aber in anderen Ressourcenverzeichnis (res/v14/style.xml).

+0

Dies scheint die rationellste Lösung zu sein. Vielen Dank. –

+0

Ich sah diesen Beitrag & ich war wie "lets go up einige Bounty", aber es ist bereits gelöst – Elltz

0

Vielleicht müssen Sie den Inhalt dieses Drawable-Objekts überprüfen, Sie verwenden das getDrawable(), um das Drawable-Objekt abzurufen, aber die API-Definition scheint nicht mit Ihren Aufrufparametern übereinzustimmen.

Für Android 5.0+

Drawable getDrawable (int id) Diese Methode in API-Ebene 22. Verwendung getDrawable (int, Theme) anstelle aufgegeben.

Drawable getDrawable (int id, Resources.Theme-Thema) Gibt ein Zeichenobjekt zurück, das einer bestimmten Ressourcen-ID zugeordnet ist und für das angegebene Thema formatiert ist.

Der zweite Parameter sieht aus wie ein Thema, keine Farbe. Recht ?

+0

Ah, Entschuldigung. Ich habe eine private Methode in 'MyButton' mit dem Namen' getDrawable (int id, int color) ', die den Aufruf in' getContext(). GetResources(). GetDrawable (int id) 'und auch' drawable.setColorFilter (color, PorterDuff.Mode.SRC_IN); '. Dies ergibt, was aussieht, ein vollkommen vernünftiger Drawable. –

0

versuchen diese

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     getResources().getDrawable(R.drawable.your_drawable, getTheme()); 
      } else { 
       getResources(). 
         getDrawable(R.drawable.your_drawable); 
      } 
+0

Die Verwendung der neuen Version mit dem Theme-Parameter hat keine Auswirkungen. –

10

Standardmäßig sind Materialschaltflächen formatiert, um Text in Großbuchstaben anzuzeigen. Es gibt jedoch einen Fehler in der AllCapsTransformationMethod, die für die Groß-/Kleinschreibung verwendet wird und dazu führt, dass es spannbare Daten verwirft.

Sie können das Standardtastenformat überschreiben und Großbuchstaben deaktivieren, indem Sie android: textAllCaps = "false" auf Ihrer Schaltfläche angeben.

<Button 
    ... 
    android:textAllCaps="false" /> 

haben einen Blick here

+0

Dies löst das Problem! –

+0

Ihre Begrüßung! Pls markieren Antwort akzeptiert :-) – Shishram

+1

WTF Android ... Danke Kerl –