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:

 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).

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.

  • Cómo crear botones sin bordes en Android
  • Cómo cambiar la visibilidad del diseño programaticly
  • Android: Utiliza diferentes estilos después de elegir un tema diferente, manteniendo las mismas referencias
  • Establecer tamaño de encabezado listview de forma programática
  • El mapa de bits de la vista no se muestra en Android
  • Cómo bloquear la orientación de la aplicación android en modo retrato?
  • Separador de dibujo de Android / Divider Line in Layout?
  • Uso de una tipografía personalizada en Android
  • Cómo centrar drawableTop y texto verticalmente en el botón en Android?
  • Cómo estructurar correctamente mi aplicación de Android, clases, vistas, bases de datos, Made Simple?
  • FindViewById () devuelve null para el componente personalizado en XML de presentación, no para otros componentes
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.