studio - Android: los márgenes especificados en el estilo personalizado no tienen efecto
manual de programacion android pdf (3)
Deseo que el margen predeterminado para EditText sea 10dp. Por lo tanto, en mi archivo styles.xml configuré lo siguiente:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="MyTheme" parent="android:style/Theme.NoTitleBar">
<item name="android:editTextStyle">@style/edit_text_default</item>
</style>
<style name="edit_text_default" parent="android:style/Widget.EditText">
<item name="android:layout_margin">10dp</item>
</style>
</resources>
Luego, en AndroidManifest.xml, configuro el tema de las aplicaciones al que definí:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/MyTheme" >
...
El aspecto "Sin barra de título" del tema está funcionando. Sin embargo, el margen predeterminado para EditText no lo es, todavía está llenando el padre. Aquí está mi vista de tabla:
<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" />
</TableRow>
<TableRow>
<EditText android:hint="@string/first_name" />
</TableRow>
</TableLayout>
En caso de que sea útil para otros, me gustaría llevar la respuesta de Oliv a otra pregunta de SO aquí. Estaba intentando agregar márgenes a todos los botones y encontré que layout_margin no funciona.
El tema:
<style name="FooThemeStyle" parent="Base.Theme.AppCompat">
<item name="android:buttonStyle">@style/FooButton</item>
<item name="buttonStyle">@style/FooButton</item>
</style>
El estilo del botón:
<style name="FooButton" parent="Widget.AppCompat.Button">
<item name="android:background">@drawable/button_background</item>
</style>
Aquí está button_background.xml donde la respuesta de Oliv a otra pregunta SO se usa para establecer el margen en 2dp:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp">
<selector xmlns:android="http://schemas.android.com/apk/res/android">
...
</selector>
</item>
</layer-list>
No estás usando el nombre del tema correcto en tu Manifiesto. Intenta cambiarlo a:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/MyTheme" >
Respuesta corta: si está especificando layout_margin en un estilo personalizado, este estilo debe aplicarse explícitamente a cada vista individual en la que desee 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: Los atributos que comienzan con layout_
son LayoutParams , o una de sus subclases (por ejemplo, MarginLayoutParams ). LayoutParams
utilizan LayoutParams
para decirle a su grupo de vista principal cómo desean que se distribuyan. Cada clase de ViewGroup
implementa una clase anidada que extiende ViewGroup.LayoutParams
. Por lo tanto, los LayoutParams
son específicos para el tipo de ViewGroup
. Lo que esto significa es que si bien TableLayout
y LinearLayout
pueden tener layout_margin
como uno de sus LayoutParams
, se consideran atributos completamente diferentes.
Entonces layout_margin
no es solo un atributo general que puede aplicarse en cualquier lugar. Debe aplicarse dentro del contexto de un ViewGroup
que lo define específicamente como un argumento válido. Una vista debe ser consciente del tipo de su grupo de vista principal cuando se aplican LayoutParams
.
Al especificar layout_margin en un estilo, incluido ese estilo en un tema, y al intentar aplicar ese tema a una aplicación / actividad, los atributos del diseño se eliminarán, ya que aún no se ha especificado ningún elemento principal de ViewGroup, por lo que los argumentos no son válidos. Sin embargo, aplicar el estilo a una vista EditText
que se ha definido con un TableLayout
funciona porque se ViewGroup
el TableLayout
ViewGroup
(el TableLayout
).
Fuentes:
Documentación de Android en parámetros de diseño .
Respuesta dada a esta pregunta por el ingeniero de marcos de Android y el usuario de .
Además, la respuesta dada a esta pregunta por el usuario de inazaruk .