En este , este y este hilo intenté encontrar una respuesta sobre cómo establecer los márgenes en una sola vista. Sin embargo, me preguntaba si no hay una manera más fácil. Explicaré por qué preferiría no usar este enfoque:
Tengo un botón personalizado que extiende el botón. Si el fondo se establece en algo más que el fondo por defecto (ya sea llamando setBackgroundResource(int id)
o setBackgroundDrawable(Drawable d)
), quiero que los márgenes sean 0. Si llamo a esto:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Quiero que los márgenes se restablezcan a -3dp (ya leí aquí cómo convertir de píxeles a dp, así que una vez que sepa cómo configurar los márgenes en px, puedo gestionar la conversión yo mismo). Pero como esto se llama en la CustomButton
clase, el padre puede variar de LinearLayout a TableLayout, y prefiero que no obtenga a su padre y verifique la instancia de ese padre. Eso también será bastante deficiente, me imagino.
Además, cuando llamo (usando LayoutParams) parentLayout.addView(myCustomButton, newParams)
, no sé si esto lo agrega a la posición correcta (sin embargo, no lo he intentado), diga el botón central de una fila de cinco.
Pregunta: ¿Hay alguna manera más fácil de establecer el margen de un solo botón mediante programación además de usar LayoutParams?
EDITAR: conozco la forma de LayoutParams, pero me gustaría una solución que evite manejar cada tipo de contenedor diferente:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
Debido a que this.getLayoutParams();
devuelve una ViewGroup.LayoutParams
, que no tienen los atributos topMargin
, bottomMargin
, leftMargin
, rightMargin
. La instancia de mc que ve es solo una MarginContainer
que contiene márgenes de desplazamiento (-3dp) y (oml, omr, omt, omb) y los márgenes originales (ml, mr, mt, mb).
LayoutParams - ¡NO FUNCIONA! ! !
Necesita usar el tipo de: MarginLayoutParams
Ejemplo de código para MarginLayoutParams:
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
fuente
Button
vista:ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams()
vuelvenull
La mejor manera:
Cómo llamar al método:
Espero que esto te ayudará.
fuente
Entonces
O
fuente
Aquí está la respuesta todo en uno con actualizaciones recientes:
Paso 1, para actualizar el margen
La idea básica es obtener margen y luego actualizarlo. La actualización se aplicará automáticamente y no necesita volver a configurarla. Para obtener los parámetros de diseño, simplemente llame a este método:
El
LayoutParams
viene del diseño de su vista. Si la vista es de un diseño lineal, debe importarLinearLayout.LayoutParams
. Si usa diseño relativo, importaciónLinearLayout.LayoutParams
, etc.Ahora, si se establece el margen usando
Layout_marginLeft
,Right
, etc, es necesario margen de actualización de esta maneraSi configura el margen usando el nuevo
layout_marginStart
, debe actualizar el margen de esta maneraPaso 2, para actualizar el margen en dp
Las dos formas de actualizar el margen anterior se actualizan en píxeles. Necesita hacer una traducción de dp a píxeles.
Ahora coloque el valor calculado en las funciones de actualización de margen anteriores y debería estar todo listo
fuente
layout_margin es una restricción que una vista secundaria le dice a su padre. Sin embargo, es el papel de los padres elegir si se permite el margen o no. Básicamente, al configurar android: layout_margin = "10dp", el niño está pidiendo al grupo de vista principal que asigne un espacio que es 10dp más grande que su tamaño real. (padding = "10dp", por otro lado, significa que la vista secundaria hará que su propio contenido sea 10dp más pequeño ).
En consecuencia, no todos los grupos de vista respetan el margen . El ejemplo más notorio sería la vista de lista, donde se ignoran los márgenes de los elementos. Antes de llamar
setMargin()
a un LayoutParam, siempre debe asegurarse de que la vista actual esté en un ViewGroup que admita márgenes (por ejemplo, LinearLayouot o RelativeLayout), y envíe el resultadogetLayoutParams()
a los LayoutParams específicos que desee. (¡ViewGroup.LayoutParams
Ni siquiera tienesetMargins()
método!)La siguiente función debería hacer el truco. Sin embargo, asegúrese de sustituir RelativeLayout por el tipo de vista principal.
fuente
Este método le permitirá establecer el margen en DP
ACTUALIZAR
Puede cambiar el parámetro que se adapte a sus necesidades.
fuente
En Kotlin se verá así:
fuente
Cuando está en una vista personalizada, puede usar
getDimensionPixelSize(R.dimen.dimen_value)
, en mi caso, agregué el margen en LayoutParams creado eninit
método.En kotlin
en Java:
fuente
Puede usar este método y poner un dimen estático como 20 que convierte según su dispositivo
fuente
Use este método para establecer el margen en dp
llama al método:
fuente
Para una configuración rápida de una línea, use
pero tenga cuidado con cualquier uso incorrecto de LayoutParams, ya que esto no tendrá una
if
instancia de declaración chechfuente
Creé una función de extensión de Kotlin para aquellos de ustedes que podrían encontrarla útil.
Asegúrese de pasar en píxeles no dp. Feliz codificación :)
fuente
En mi ejemplo, estoy agregando un ImageView a un LinearLayout programáticamente. He configurado los márgenes superior e inferior para ImagerView. Luego, agregue ImageView a LinearLayout.
fuente
Como hoy, lo mejor es probablemente usar París , una biblioteca proporcionada por AirBnB.
Los estilos se pueden aplicar así:
También admite la vista personalizada (si extiende una vista) mediante anotaciones:
fuente
Tienes que llamar
al igual que:
your_view.setPadding(0,16,0,0)
Lo que está tratando de usar es solo el captador.
Android Studio muestra lo que
padding...()
realmente significa en Java:ejemplo de relleno La imagen muestra que solo llama
getPadding...()
Si desea agregar un margen a su TextView, deberá LayoutParams:
fuente
Tuve que lanzar el mío
FrameLayout
para un diseño lineal ya que hereda de él y establecer márgenes allí para que la actividad aparezca solo en una parte de la pantalla junto con un fondo diferente al de los parámetros de diseño originales en elsetContentView
.¡Ninguno de los otros trabajó para usar la misma actividad y cambiar los márgenes basados en abrir la actividad desde un menú diferente! setLayoutParams nunca funcionó para mí: el dispositivo se bloqueaba cada vez. Aunque estos son números codificados, este es solo un ejemplo del código solo con fines de demostración.
fuente
Puede usar
ViewGroup.MarginLayoutParams
para establecer el ancho, la altura y los márgenesDonde el método
setMargins();
toma valores para izquierda, arriba, derecha, abajo respectivamente. En el sentido de las agujas del reloj !, comenzando desde la izquierda.fuente