Android: los márgenes especificados en estilo personalizado no tienen efecto

Deseo que el margen predeterminado para EditText sea 10dp. Por lo tanto, en mi archivo styles.xml configuré lo siguiente:

  @style/edit_text_default   10dp   

Luego, en AndroidManifest.xml, configuré el tema de las aplicaciones al que definí:

  ... 

El aspecto “No Title Bar” del tema está funcionando. Sin embargo, el margen predeterminado para EditText no es, todavía está llenando el padre. Aquí está mi vista de tabla:

         

Respuesta corta: si está especificando layout_margin en un estilo personalizado, este estilo se debe aplicar explícitamente a cada vista individual 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á.

         

Explicación: los atributos que comienzan con layout_ son LayoutParams o una de sus subclases (por ejemplo, MarginLayoutParams ). LayoutParams usan LayoutParams para indicar a su Parent ViewGroup cómo quieren que se distribuyan. Cada clase ViewGroup implementa una clase anidada que amplía ViewGroup.LayoutParams . Por lo tanto, LayoutParams son específicos para el tipo de ViewGroup . Lo que esto significa es que, si bien un TableLayout y un LinearLayout pueden tener layout_margin como uno de sus 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 un ViewGroup que específicamente lo define como un argumento válido. Una vista debe conocer el tipo de su ViewGroup principal cuando se aplican 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 todavía no se ha especificado ningún padre ViewGroup y por lo tanto los argumentos no son válidos. Sin embargo, la aplicación del estilo a una vista EditText que se ha definido con un TableLayout funciona porque se ViewGroup el TableLayout ViewGroup ( TableLayout ).

Fuentes:

Documentación de Android en Parámetros de diseño .

Respuesta dada a esta pregunta por el ingeniero de framework Android y el usuario de StackOverflow adamp .

Además, la respuesta dada a esta pregunta por el usuario de StackOverflow inazaruk .

No estás usando el nombre del tema correcto en tu Manifiesto. Intenta cambiarlo a:

  

En caso de que sea útil para otros, me gustaría traer la respuesta de Oliv a otra pregunta SO aquí. Intenté agregar márgenes a todos los botones y encontré que layout_margin no funciona.

El tema:

  

El estilo del botón:

  

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