En Android, ¿cómo configuro los márgenes en dp mediante programación?
En esto , este y este hilo traté de 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. Voy a explicar por qué no me gustaría utilizar este enfoque:
Tengo un botón personalizado que extiende el botón. Si el fondo se establece en algo distinto al fondo predeterminado (llamando a setBackgroundResource(int id)
o setBackgroundDrawable(Drawable d)
), quiero que los márgenes sean 0. Si llamo a esto:
- Creación de la aplicación de soporte para varias pantallas Android
- Android: la gravedad falla en API 18+
- Establecer márgenes en un LinearLayout programáticamente
- ¿Cuál es el diseño predeterminado de un ImageView?
- Ejemplo simple de uso de <merge> y <include> en diseños XML de Android
public void setBackgroundToDefault() { backgroundIsDefault = true; super.setBackgroundResource(android.R.drawable.btn_default); // Set margins somehow }
Quiero que los márgenes para restablecer a -3dp (Ya he leído aquí cómo convertir de píxeles a dp, por lo que una vez que sé cómo configurar los márgenes en px, puedo gestionar la conversión yo mismo). Pero ya que esto se llama en la clase CustomButton
, el padre puede variar de LinearLayout a TableLayout, y prefiero no tener a su padre y comprobar la instancia de ese padre. Eso también será bastante inperformant, me imagino.
También, al llamar (usando LayoutParams) parentLayout.addView(myCustomButton, newParams)
, no sé si esto lo agrega a la posición correcta (no lo he intentado sin embargo), digamos el botón central de una fila de cinco.
Pregunta: ¿Hay alguna manera más fácil de establecer el margen de un botón único mediante programación además de usar LayoutParams?
EDIT: Sé de la forma LayoutParams, pero me gustaría una solución que evita el manejo de 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); } }
Porque this.getLayoutParams();
Devuelve un ViewGroup.LayoutParams
, que no tiene los atributos topMargin
, bottomMargin
, leftMargin
, rightMargin
. La instancia de mc que ves es sólo un MarginContainer
que contiene los márgenes de desplazamiento (-3dp) y (oml, omr, omt, omb) y los márgenes originales (ml, mr, mt, mb).
- Wrap_content height, pero limitado a la mitad de los padres
- Disposición de Android, cambiar el tamaño por porcentaje y mantener la proporción
- Android setVisibility no se muestra si inicialmente se establece en invisible
- widgets que faltan en la paleta de diseño gráfico (android en eclipse)
- SetSupportActionBar no funciona FragmentActivity
- Modificación del widget de barra de búsqueda de Android para que funcione verticalmente
- Java.lang.UnsupportedOperationException: No se puede convertir a dimension: type = 0x12
- Android Porcentaje Altura de diseño
Debe utilizar LayoutParams
para establecer los márgenes de los botones:
LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ); params.setMargins(left, top, right, bottom); yourbutton.setLayoutParams(params);
Dependiendo del diseño que esté usando, debe utilizar RelativeLayout.LayoutParams
o LinearLayout.LayoutParams
.
Y para convertir su medida dp a píxeles, pruebe esto:
Resources r = mContext.getResources(); int px = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, yourdpmeasure, r.getDisplayMetrics() );
LayoutParams – NO TRABAJO! ! !
Necesita usar el tipo de: MarginLayoutParams
MarginLayoutParams params = (MarginLayoutParams) vector8.getLayoutParams(); params.width = 200; params.leftMargin = 100; params.topMargin = 200;
Ejemplo de código para MarginLayoutParams:
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
La mejor manera:
private void setMargins (View view, int left, int top, int right, int bottom) { if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); p.setMargins(left, top, right, bottom); view.requestLayout(); } }
Cómo llamar al método:
setMargins(mImageView, 50, 50, 50, 50);
Espero que esto te ayudará.
int sizeInDP = 16; int marginInDp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, sizeInDP, getResources() .getDisplayMetrics());
Entonces
layoutParams = myView.getLayoutParams() layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp); myView.setLayoutParams(layoutParams);
O
LayoutParams layoutParams = new LayoutParams... layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp); myView.setLayoutParams(layoutParams);
Layout_margin es una restricción que un niño de vista le dice a su padre. Sin embargo, es el papel de los padres elegir si se permite margen o no. Básicamente, al establecer android: layout_margin = "10dp", el niño está invocando el grupo de vista padre para asignar un espacio que es 10dp mayor 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 ViewGroups respetan el margen . El ejemplo más notorio sería listview, donde los márgenes de los elementos son ignorados. Antes de llamar a setMargin()
a un LayoutParam, siempre debe asegurarse de que la vista actual esté viviendo en un ViewGroup que admita el margen (por ejemplo, LinearLayouot o RelativeLayout) y arroje el resultado de getLayoutParams()
a los LayoutParams específicos que desee. ( ViewGroup.LayoutParams
ni siquiera tiene el método setMargins()
!)
La siguiente función debe hacer el truco. Sin embargo, asegúrese de sustituir RelativeLayout por el tipo de vista principal.
private void setMargin(int marginInPx) { RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams(); lp.setMargins(marginInPx,marginInPx, marginInPx, marginInPx); setLayoutParams(lp); }
Este método le permitirá establecer el margen en DP
public void setMargin(Context con,ViewGroup.LayoutParams params,int dp) { final float scale = con.getResources().getDisplayMetrics().density; // convert the DP into pixel int pixel = (int)(dp * scale + 0.5f); ViewGroup.MarginLayoutParams s =(ViewGroup.MarginLayoutParams)params; s.setMargins(pixel,pixel,pixel,pixel); yourView.setLayoutParams(params); }
ACTUALIZAR
Puede cambiar el parámetro que se adapte a sus necesidades.
- Singletons vs. Contexto de la aplicación en Android?
- Envío de correo electrónico en Android mediante API de JavaMail sin usar la aplicación predeterminada / incorporada