2010-05-26 14 views
11

Uso de formas de Android en xml He definido un degradado que utilizo como fondo para un botón.Botones personalizados en Android: ¿Cómo obtener borde/borde/marco cuando leo el fondo de xml?

Todo esto funciona bien, pero no hay borde que rodea el botón. Me gustaría que se vea similar al botón normal de Android, pero necesito más flexibilidad para controlar el color y el aspecto.

La forma se define como sigue:

<?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> 

Yo esperaría que la frontera que se encuentra en el xml. ¿Por qué el "trazo" no lo arregla? El accidente cerebrovascular no parece hacer nada. he comprobado la especificación desarrollador de Android, pero no pudo encontrar la respuesta allí: http://developer.android.com/guide/topics/resources/drawable-resource.html

También he mirado a través de todas las propiedades del botón de Android, pero como era de esperar no hay tal parámetro, probablemente, puesto que está basado en el botón normal de Android. Por cierto, también revisé las propiedades de ImageButton.

¿Alguien puede ayudarnos? Sé que existe la alternativa de hacer una imagen con los bordes adecuados y usar un ImageButton, pero realmente debería haber una manera de arreglar esto programáticamente.

Gracias! Anna

+0

El código xml no apareció en mi pregunta anterior. ¿Puede alguien decirme si hay ciertas etiquetas que usar para obtener el stackoverflow-box que he visto que las personas usan para ingresar el código? – Anna

+0

(Por cierto: para agregar HTML a sus publicaciones, debe sangrar cada línea por 4 espacios, igual que para agregar código. Si no lo hace, el analizador de texto de SO se confunde y no se muestra su HTML.) –

Respuesta

19

Tuve este problema hace un tiempo. Aunque no recuerdo exactamente por qué tomé cada decisión, la forma en que lo resolví fue usar una lista de capas de formas. Esto le permite apilar una forma sobre otra. Por ejemplo, el siguiente código XML crea una forma con un sólido 2px contorno negro de ancho, con un 'gris a blanco a gris' de gradiente a través del 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> 

Si usted quiere ser capaz de cambiar ese color dinámicamente en tiempo de ejecución, entonces las cosas obtienen un lote messier. Una vez más, los detalles de por qué tenía que hacer las cosas de cierta manera son nebulosos, pero terminé teniendo que crear una clase de vista personalizada que contenía un ShapeDrawable personalizado. Empecé mirando los ejemplos de la aplicación ApiDemos que viene con el SDK: es un muy buen recurso.

EDIT: Otra razón por la que su trazo podría no aparecer es que olvidó el android: antes del bit de color = "....".

+2

EDITAR: Otra razón por la que su trazo podría no aparecer es que olvidó el android: antes del bit color = "....". ¡Eso es! – Entreco

+0

señor, debe establecer esto como respuesta correcta –

3

Probablemente es demasiado tarde, pero tiene que agregar un ff adicional antes del color.

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

Saluda

1

Uso ImageButton

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

Uso del selector dibujable a ImageButton y definir sus propiedades

<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

He tenido el mismo problema, lo que he observado es que el trazo no se aplica al botón como borde en el tiempo de diseño pero en el tiempo de ejecución veo el borde.

I JST usaron los siguientes mismo código

<?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> 

como Steve Hanley dijo abvoe se le pasa el androide : para el atributo de color.

Espero que esto ayude a alguien ....

+0

funciona. Gracias :) –

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> 

Adición stroke color #56390a va a resolver el problema.

Cuestiones relacionadas