android - studio - Para usar layout_marginLeft en un estilo de botón aplicado como un tema?
add padding android studio (5)
¿Alguna vez has llegado 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 usando el atributo "estilo" en el botón. Parece que los márgenes no son parte de la especificación "buttonStyle".
layout_marginLeft="30dip"
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.
Pero luego android:buttonStyle
un tema, donde android:buttonStyle
mi estilo de botón al atributo android:buttonStyle
y lo apliqué a mi proyecto.
Sin embargo, la propiedad del margen izquierdo se ignora. ¿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>
Hay una respuesta increíble aquí en . Básicamente LayoutParams
(layout_) se utilizan para vistas secundarias para indicar a su ViewGroup
cómo deben posicionarse. Pero LayoutParams
son específicos para cada tipo de grupo de ViewGroup
( LinearLayout
, RelativeLayout
, FrameLayout
, etc.) por lo que LayoutParams
no se puede generalizar de este modo para un tema.
Todo esto es muy desafortunado ya que no puedes usar estilos completamente generalizados en un tema, pero aún puedes usar el estilo para cada vista específica donde la necesites, como por ejemplo:
<Button style="@style/btnstyle"/>
Parece que esto se puede lograr al envolver una etiqueta de insertos alrededor de la forma.
Me gusta esto:
<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>
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.
Por lo tanto, las propiedades de width
, height
, padding
y layout
en el elemento XML y el resto de los atributos dentro del estilo.
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á.
<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
usan LayoutParams
para indicar a su 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 adamp .
Además, la respuesta dada a esta pregunta por el usuario de inazaruk .
No quiero ningún crédito de esta respuesta, el verdadero héroe está aquí - https://.com/a/13365288/4741746