2010-05-26 13 views
11

Utilizzo di forme Android in xml Ho definito un gradiente che utilizzo come sfondo per un pulsante.Pulsanti personalizzati in Android: come ottenere bordi/bordi/cornice quando leggo lo sfondo da xml?

Questo funziona tutto bene, ma non c'è nessun limite attorno al pulsante. Mi piacerebbe che assomigliasse al normale pulsante Android, ma ho bisogno di più flessibilità per controllare il colore e l'aspetto.

La forma è definita come segue:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient android:startColor="#FFFFFF" 
     android:endColor="#00FF00" 
     android:angle="270" /> 
    <corners android:radius="3dp" /> 
    <stroke android:width="5px" color="#000000" /> 
</shape> 

mi aspetterei che il confine per essere impostato nel xml. Perché "ictus" non lo aggiusta? L'ictus non sembra fare nulla. Ho controllato il Developer specifiche di Android, ma non riusciva a trovare la risposta c'è: http://developer.android.com/guide/topics/resources/drawable-resource.html

Ho anche guardato attraverso tutte le proprietà del pulsante di Android, ma come previsto non c'è tale parametro, probabilmente dal momento che è integrato nel normale pulsante Android. A proposito, ho controllato anche le proprietà ImageButton.

Qualcuno può aiutare? So che c'è un'alternativa per fare un'immagine con i bordi corretti e usare un ImageButton, ma ci dovrebbe essere davvero un modo per sistemarlo a livello di programmazione.

Grazie! Anna

+0

Il codice xml non è stato visualizzato nella mia domanda sopra. Qualcuno può dirmi se ci sono determinati tag da usare per ottenere la scatola StackOverflow che ho visto usare per inserire il codice? – Anna

+0

(A proposito: per aggiungere HTML ai tuoi post devi indentare ogni riga di 4 spazi, come se dovessi aggiungere il codice. Se non lo fai, l'analizzatore di testo di SO si confonde e il tuo HTML non viene visualizzato.) –

risposta

19

Ho avuto questo problema qualche tempo fa. Mentre non ricordo bene perché ho preso ogni decisione, il modo in cui ho risolto è stato quello di usare una lista di livelli forma. Ciò ti consente di impilare una forma sopra un'altra. Ad esempio, il seguente codice XML crea una forma con una solida 2px contorno nero di larghezza, con un 'grigio al bianco al grigio' gradiente in tutto il centro:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape> 
      <padding android:left="1dp" 
       android:top="1dp" 
       android:right="1dp" 
       android:bottom="1dp"/> 
      <solid android:color="#FF000000"/> 
      <corners android:radius="3dp"/> 
     </shape> 
    </item> 

    <item> 
     <shape> 
      <padding android:left="2dp" 
       android:top="2dp" 
       android:right="2dp" 
       android:bottom="2dp"/> 
      <gradient android:startColor="#FFB0B0B0" 
       android:centerColor="#FFFFFFFF" 
       android:endColor="#FFB0B0B0" 
       android:angle="315"/> 
     </shape> 
    </item> 
</layer-list> 

Se si vuole essere in grado di cambiare quel colore dinamicamente a runtime, quindi le cose ottengono un lotto messier. Di nuovo, i dettagli del perché dovevo fare le cose in un certo modo sono confusi, ma alla fine ho dovuto creare una classe di visualizzazione personalizzata che contenesse un ShapeDrawable personalizzato. Ho iniziato a guardare gli esempi dall'app ApiDemos fornita con l'SDK: è un'ottima risorsa.

EDIT: Un altro motivo il tratto potrebbe non apparirà è che ti sei dimenticato il android: prima del color = "...." bit.

+2

EDIT: Un altro motivo per cui il tuo tratto potrebbe non apparire è che hai dimenticato l'androide: prima del bit color = "....". Questo è tutto! – Entreco

+0

signore, dovresti impostare come risposta corretta –

3

Probabilmente molto in ritardo, ma è necessario aggiungere un extra ff prima del colore.

<stroke android:width="5px" color="#ff000000" />

saluta

1

Usa ImageButton

<ImageButton 
     android:layout_width="40dp" 
     android:layout_height="30dp" 
     android:src="@drawable/left_arrow" 
     android:background="@drawable/button_selector" 
     android:gravity="center"/> 

Usa selettore drawable di ImageButton e definire le proprietà

<item android:state_pressed="true" > 
    <shape> 
     <gradient 
      android:startColor="@color/startColor" 
      android:endColor="@color/endColor" 
      android:angle="270" /> 
     <stroke 
      android:width="0.5dp" 
      android:color="@color/borderColor" /> 
     <corners 
      android:topLeftRadius="5dp" 
      android:bottomRightRadius="5dp"/> 
    </shape> 
</item> 

<item android:state_focused="true" > 
    <shape> 
     <gradient 
      android:startColor="@color/startColor" 
      android:endColor="@color/endColor" 
      android:angle="270" /> 
     <stroke 
      android:width="0.5dp" 
      android:color="@color/borderColor" /> 
     <corners 
      android:topLeftRadius="5dp" 
      android:bottomRightRadius="5dp"/> 
    </shape> 
</item> 

<item>   
    <shape> 
     <gradient 
      android:startColor="@color/startColor" 
      android:endColor="@color/endColor" 
      android:angle="270" /> 
     <stroke 
      android:width="0.5dp" 
      android:color="@color/borderColor" /> 
     <corners 
      android:topLeftRadius="5dp" 
      android:bottomRightRadius="5dp"/> 
    </shape> 
</item>  

6

Ho avuto lo stesso problema, quello che ho osservato è che il tratto non si applica al pulsante come bordo in fase di progettazione ma in fase di esecuzione vedo il bordo.

ho JST usato il seguente stesso codice

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" android:padding="10dp"> 
    <solid android:color="@color/black" /> 
    <stroke android:width="1px" android:color="@color/red" /> 

</shape> 

come ha detto Steve Hanley abvoe si perde l'Android: per l'attributo di colore.

Spero che questo aiuti qualcuno ....

+0

funziona. Grazie :) –

0

<item android:state_enabled="false" android:drawable="@drawable/button_disabled" /> 

<item android:state_focused="true" android:drawable="@drawable/button_highlighted"/> 
<item android:state_pressed="true" android:drawable="@drawable/button_highlighted"/> 

<item> 
    <shape> 
     <gradient android:startColor="#fdfdfd" android:endColor="#f0f0f0" android:angle="270" /> 
     <stroke android:width="1dp" android:color="#56390a" /> 
     <corners android:radius="3dp" /> 
     <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    </shape> 
</item> 

Aggiunta stroke color #56390a risolverà il problema.

Problemi correlati