2012-11-13 16 views
8

Qualcuno può spiegarmi perché questo sta accadendo?Il riempimento non funziona con determinate risorse di sfondo

Ho una classe abbastanza semplice che estende TextView. Quando imposto il colore di sfondo su Color.BLUE, il riempimento funziona correttamente. Quando cambio la risorsa di sfondo in android.R.drawable.list_selector_background, il mio padding non viene più applicato. Che la F?

Ecco la mia classe UI:

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); 
    } 
} 

e sto usando nel layout in questo modo:

<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"/> 

E questo è il risultato di cambiare lo sfondo: enter image description here

risposta

11

La chiamata a:

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

rimuoverà qualsiasi padding impostato in precedenza (questo per farlo funzionare correttamente con risorse a 9 patch).

Tenta di impostare l'imbottitura in codice dopo la linea di cui sopra, in questo modo:

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

Basta ricordare che i valori inviati per setPadding è espressa in pixel Non immergere!

+1

Ulteriori informazioni possono essere trovate qui: http://stackoverflow.com/questions/2886140/does-changing-the-background-also-change-the-padding-of-a-earearlayout – TofferJ

2

Si dovrebbe impostare lo sfondo disegnabile in XML se possibile. Se lo si imposta in codice, utilizzerà il padding delle risorse estraibili anziché quello impostato in XML, quindi se è necessario farlo a livello di codice, è necessario recuperare il riempimento corrente, salvarlo temporaneamente, impostare lo sfondo e quindi reimpostare il padding come suggerito da @TofferJ.

La ragione di ciò è che i drawable stessi possono avere padding, nel caso di immagini a 9 patch (dove i bordi del pixel inferiore e destro definiscono la quantità di padding).

La soluzione dovrebbe essere quello di impostare solo la tua risorsa di fondo in XML:

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

anche se credo che possa essere una risorsa privata drawable che dovrete copiare nel proprio progetto prima.

+1

Grazie, questo è un grande soluzione poiché utilizzo solo alcune istanze della mia classe UI. Ho scoperto che non dovevo copiarlo nel mio progetto. Questa linea acquisirà il drawable integrato da qualsiasi dispositivo su cui è installata l'app. – raydowe

Problemi correlati