temas studio programacion personalizar para móviles icono editar descargar desarrollo curso bar aplicaciones agregar android styles themes

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 .