2012-11-13 11 views
8

Kann mir jemand erklären, warum das passiert?Padding funktioniert nicht mit bestimmten Hintergrundressource

Ich habe eine ziemlich einfache Klasse TextView erweitern. Wenn ich die Hintergrundfarbe auf Color.BLUE einstelle, funktioniert Padding gut. Wenn ich die Hintergrundressource in android.R.drawable.list_selector_background ändere, wird mein Padding nicht länger angewendet. Was zum F?

Hier ist meine UI-Klasse:

public class GhostDropDownOption extends TextView { 

    TextView text_view; 


    public GhostDropDownOption(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setup(context); 
    } 


    public GhostDropDownOption(Context context) { 
     super(context); 
     setup(context); 
    } 


    private void setup(Context context) { 
     this.setClickable(false); 
     // THE 2 LINES BELOW ARE THE ONLY THING I'M CHANGING 
     //this.setBackgroundResource(android.R.drawable.list_selector_background); 
     this.setBackgroundColor(Color.BLUE); 
    } 
} 

Und ich bin es im Layout wie folgt aus:

<trioro.voyeur.ui.GhostDropDownOption 
    android:id="@+id/tv_dropdown_option_1" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="@string/request_control_dropdown_option_1" 
    android:textColor="#000000" 
    android:padding="10dip"/> 

Und das ist das Ergebnis der Änderung des Hinter: enter image description here

Antwort

11

Der Anruf an:

this.setBackgroundResource(android.R.drawable.list_selector_background); 

wird alle zuvor festgelegten Padding entfernen (damit es mit 9-Patch-Assets richtig funktioniert).

Versuchen Sie, die Polsterung im Code nach der Zeile oben zu setzen, wie folgt aus:

this.setPadding(PADDING_CONSTANT, PADDING_CONSTANT, PADDING_CONSTANT, PADDING_CONSTANT); 

Denken Sie daran, dass die zu setPadding gesendeten Werte in Pixeln ist nicht tauchen!

+1

Weitere Informationen finden Sie hier: http://Stackoverflow.com/questions/2886140/does-changing-the-background-als-change-the-padding-of-a-linearlayout – TofferJ

2

Sie sollten Ihren Hintergrund, wenn überhaupt möglich, in XML einrahmen können. Wenn Sie es in Code festlegen, verwendet es das Padding aus Ihren zeichnbaren Ressourcen und nicht das, was Sie in XML festgelegt haben. Wenn es also programmgesteuert erforderlich ist, sollten Sie das aktuelle Padding abrufen, es vorübergehend speichern und den Hintergrund festlegen , und setzen Sie dann das Padding zurück, wie @TofferJ vorschlägt.

Der Grund dafür ist, dass die Zeichenvorlagen selbst im Fall von 9-Patch-Bildern (bei denen die unteren und rechten Pixelränder den Füllgrad definieren) ein Padding haben können.

sollte Ihre Lösung sein, nur in XML Ihren Hintergrund Ressource festgelegt:

android:background="@android:drawable/list_selector_background"

obwohl ich das auch sein mag eine private ziehbar Ressource glaube, dass Sie zuerst in Ihr Projekt kopieren.

+1

Danke, das ist ein großartiges Lösung, da ich nur ein paar Instanzen meiner UI-Klasse verwende. Es stellte sich heraus, dass ich es nicht in mein Projekt kopieren musste. In dieser Zeile wird das eingebaute Zeichen von jedem Gerät abgerufen, auf dem die App installiert ist. – raydowe

Verwandte Themen