2013-01-24 12 views
13

Il codice seguente è per la visualizzazione di un pulsante personalizzato in Android. Sfortunatamente, tutti i valori di padding in quei diversi punti influenzano il modo in cui il pulsante viene visualizzato solo per Android 2.3, ma su Android 4.X non ha alcun effetto, cioè il padding è sempre lo stesso, indipendentemente da ciò che si imposta qui. Perché?Pulsante personalizzato con sfondo selezionabile: differenza di riempimento in Android 4 rispetto a Android 2.3

L'XML di layout:

<Button 
    android:id="@+id/sample_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/button_caption" 
    android:padding="6dp" 
    android:layout_marginBottom="6dp" 
    android:layout_marginRight="6dp" 
    style="@style/CustomButton" 
    android:textSize="16sp" /> 

Lo stile:

<style name="CustomButton"> 
    <item name="android:layout_gravity">center_horizontal</item> 
    <item name="android:padding">6dp</item> 
    <item name="android:background">@drawable/custom_button</item> 
    <item name="android:textColor">#ffffff</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textStyle">bold</item> 
</style> 

Il drawable:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <shape> 
      <solid 
       android:color="#60ff0000" /> 
      <stroke 
       android:width="1dp" 
       android:color="#ffffff" /> 
      <corners 
       android:radius="4dp" /> 
      <padding 
       android:left="6dp" 
       android:top="6dp" 
       android:right="6dp" 
       android:bottom="6dp" /> 
     </shape> 
    </item> 
    <item> 
     <shape> 
      <solid 
       android:color="#90ff0000" /> 
      <stroke 
       android:width="1dp" 
       android:color="#ffffff" /> 
      <corners 
       android:radius="4dp" /> 
      <padding 
       android:left="6dp" 
       android:top="6dp" 
       android:right="6dp" 
       android:bottom="6dp" /> 
     </shape> 
    </item> 
</selector> 

Quando ho impostato tutto Ts I valori di padding su un valore piccolo come 2, il pulsante è mostrato quasi senza un padding su Android 2.3.3 (probabilmente corretto) ma con un padding che è ancora molto grande su Android 4.X (probabilmente sbagliato). Qualcuno può vedere perché?

risposta

31

Il tema Holo di Android imposta minWidth e minHeight nello system styles.xml resource for Holo.Widget.Button che specifica le regole oltre a quelle utilizzate dal pulsante non-holo, Widget.Button. Anche con un titolo di pulsante piccolo, il pulsante occuperà 64x48dip in Android 4.2.

<Button 
    android:id="@+id/sample_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Z" 
    android:padding="6dp" 
    android:minHeight="1dp" 
    android:minWidth="1dp" 
    android:layout_marginBottom="6dp" 
    android:layout_marginRight="6dp" 
    style="@style/CustomButton" 
    android:textSize="16sp" /> 
+3

Felice di aiutare - la morale di questa storia è controllare sempre lo stile/codice su Github per gli indizi sul comportamento predefinito. –

+0

Sì, ho capito;) – caw

0

La risposta di David potrebbe effettivamente essere il problema.

Tuttavia, penso che se la larghezza e l'altezza min sono 48/64dp, la modifica del padding da 6dp a 2pd o viceversa non dovrebbe fare una grande differenza, a meno che il pulsante effettivo sia già a 48/64 dp dimensione.

Se questo è il caso, mi chiedo se potrebbe essere un bug su Android. Se non viene specificata alcuna spaziatura nella vista, viene utilizzato il padding nel background drawable (se presente) Se è specificato il riempimento nella vista, qualsiasi padding nel background drawable viene ignorato e viene utilizzato il padding impostato nella vista.

Proprio per il gusto di farlo, hai provato a rendere le imbottiture molto grandi invece che piccole e vedere se questo ha qualche effetto?

+0

Potresti avere ragione. Senza conoscere il valore di '@ string/button_caption' e vedere esattamente cosa vede Marco, si può solo ipotizzare. Sono d'accordo che potrebbe essere un bug, anche se sarei molto sorpreso se il riempimento drawable fosse la causa. Il valore di riempimento dovrebbe influire solo sul disegno dello sfondo. –

+0

Grazie! Potrebbe essere stato un bug, avevi ragione. Dovevo controllarlo - ed è * non *. Tutto sta funzionando bene e la spiegazione di questo problema è ciò che David ha scritto. – caw

Problemi correlati