2010-09-23 10 views
28

Utilicé un atributo layout_marginLeft="30dip" en un estilo definido para botones. Cuando aplico este estilo individualmente para cada botón, el margen izquierdo se coloca como yo quería.Para usar layout_marginLeft en un estilo de botón aplicado como un tema?

Pero luego definí un tema, donde asigné mi estilo de botón al atributo android:buttonStyle y lo apliqué a mi proyecto.
Sin embargo, se ignora la propiedad del margen izquierdo. ¿Alguna idea de lo que debo hacer aquí?

style.xml de la siguiente manera:

<style name="btnstyle" parent="@android:style/Widget.Button"> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_marginLeft">30dip</item> 
    <item name="android:textColor">#FFFFFF</item>  
</style> 

<style name="appstyle" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/btnstyle</item> 
</style> 

Respuesta

3

nunca llegar al fondo de esto? Estoy teniendo el mismo problema; todos los atributos de margen se ignoran cuando se aplican a un Botón o ImageButton a través de un estilo dentro de un tema.

Sin embargo, he encontrado que funciona cuando el estilo se aplica directamente utilizando el atributo "estilo" en el botón. Parece que los márgenes no son parte de la especificación "buttonStyle".

+0

bien, he conseguido con una solución. En lugar de establecer el margen, solo especifiqué el botón debajo de la propiedad. Es decir, especifique que los botones 2, 3 y 4 están alineados debajo del botón 1, por ejemplo. No encontré ninguna otra salida. – kiki

2

Supongo que esto es un error en Android.

Por otro lado, cuando comencé a usar estilos coloqué todo dentro del estilo. Noté que estaba creando un estilo para cada widget. En este momento, coloco atributos de posición dentro de un estilo.

Así, width, height, padding y layout propiedades en el elemento XML y el resto de los atributos dentro del estilo.

+1

Este es un error en Android Framework. Los atributos layout_margin * se ignoran en los estilos si se referencian a través del tema. – Anderson

+0

Esto es exasperante. layout_marginRight y marginLeft no se ignoran. Sin embargo, la parte superior e inferior se ignoran. –

10

Hay una respuesta increíble here on stackoverflow. Básicamente, LayoutParams (layout_) se utilizan para vistas secundarias para indicar a su padre ViewGroup cómo deben colocarse. Pero LayoutParams son específicos para cada tipo ViewGroup (LinearLayout, RelativeLayout, FrameLayout etc.) así que LayoutParams no se puede generalizar de esta manera para un tema.

Todo esto es muy lamentable, ya no se puede utilizar estilos completamente generalizadas en un tema pero todavía se puede utilizar el estilo para cada punto de vista específico donde lo necesite, como siguiente:

<Button style="@style/btnstyle"/> 
+0

¿Cómo los botones tienen márgenes por defecto entonces? ¿Cómo lo hace el marco? – Nilzor

+1

@Nilzor botones no tienen márgenes, tienen gráfico que tiene construir en margen/relleno. Verifica la carpeta de recursos y verás. si configura el gráfico de fondo para otra cosa, los botones no tendrán ningún margen – Warpzit

+0

Gracias. Así que supongo que ese es un enfoque que cualquiera que diseñe sus propios botones puede tomar también. – Nilzor

13

Parece esto puede lograrse envolviendo una etiqueta de inserciones alrededor de la forma.

De esta manera:

<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetLeft="5dp" 
    android:insetRight="5dp" 
    android:insetTop="5dp" 
    android:insetBottom="5dp"> 

<shape 
    android:shape="rectangle"> 
    <solid 
     android:color="#fff"/> 
    <stroke 
     android:width="1dp" 
     android:color="#333"/> 
    <corners 
     android:radius="10dp"/> 
</shape> 
</inset> 
+0

después de muchos intentos, este fue el único que funciona para mí, gracias. – kometonja

0

respuesta corta: Si está especificando layout_margin en un estilo personalizado, este estilo se debe aplicar de manera explícita a cada vista individual que desea tener el margen especificado (como se ve en el ejemplo de código a continuación). Incluir este estilo en un tema y aplicarlo a su aplicación o actividad no funcionará.

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF" > 
    <TableRow> 
     <EditText android:hint="@string/last_name" style="@style/edit_text_default" /> 
    </TableRow> 
    <TableRow> 
     <EditText android:hint="@string/first_name" style="@style/edit_text_default" /> 
    </TableRow> 
</TableLayout> 

Explicación: atributos que comienzan con layout_ son LayoutParams, o una de sus subclases (por ejemplo MarginLayoutParams). LayoutParams son usadas por vistas para decirle a su padre ViewGroup cómo quieren ser distribuidas.Cada clase ViewGroup implementa una clase anidada que se extiende ViewGroup.LayoutParams. Por lo tanto, LayoutParams son específicos del tipo ViewGroup. Lo que esto significa es que mientras que un TableLayout y un LinearLayout pueden tener layout_margin como uno de ellos es LayoutParams, se consideran atributos completamente diferentes.

Así que layout_margin no es solo un atributo general que se puede aplicar en cualquier lugar. Debe aplicarse dentro del contexto de ViewGroup que lo define específicamente como un argumento válido. Una vista debe ser consciente del tipo de su principal ViewGroup cuando se aplica LayoutParams.

Especificar layout_margin en un estilo, incluido ese estilo en un tema, e intentar aplicar ese tema a una aplicación/actividad dará como resultado la eliminación de los atributos de diseño, porque aún no se ha especificado ningún padre ViewGroup y los argumentos son inválido. Sin embargo, se aplica el estilo a una vista EditText que se ha definido con un TableLayout, porque se conoce el padre ViewGroup (TableLayout).

Fuentes:

documentación Android en Layout Parameters.

Respuesta dada a this question por el ingeniero de framework de Android y usuario de StackOverflow adamp.

También, respuesta dada a this question por el usuario de StackOverflow inazaruk.

no quiero ningún crédito de esta respuesta la verdadero héroe es aquí - https://stackoverflow.com/a/13365288/4741746

Cuestiones relacionadas