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