2010-03-20 30 views
221

Estoy tratando de usar Java (no XML) para crear un LinearLayout con botones que llenan la pantalla y tienen márgenes. Aquí está el código que funciona sin márgenes:Establecer márgenes en LinearLayout programmatically

LinearLayout buttonsView = new LinearLayout(this); 
buttonsView.setOrientation(LinearLayout.VERTICAL); 
for (int r = 0; r < 6; ++r) { 
    Button btn = new Button(this); 
    btn.setText("A"); 

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose! 
    lp.weight = 1.0f; // This is critical. Doesn't work without it. 
    buttonsView.addView(btn, lp); 
} 

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
setContentView(buttonsView, lp); 

Para que funciona bien, pero ¿cómo diablos le da a los márgenes de botones por lo que hay espacio entre ellos? Intenté usar LinearLayout.MarginLayoutParams, pero eso no tiene miembro weight, así que no sirve. Y tampoco funciona si lo pasa lp en su constructor.

¿Esto es imposible? Porque parece que sí, y no sería la primera tarea de diseño de Android que solo puedes hacer en XML.

+1

http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html#setMargins(int, int, int, int) En lugar de layoutParams.setMargins (30, 20, 30, 0); usted pone layoutParams.setMargins (30dp, 20dp, 30dp, 0dp); – DarthestVader

+3

setMargins toma int como argumentos .. solo puede proporcionar "dp" usando xml atributos – jyavenard

Respuesta

432

Aquí es un poco de código para lograrlo:

LinearLayout ll = new LinearLayout(this); 
ll.setOrientation(LinearLayout.VERTICAL); 

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

layoutParams.setMargins(30, 20, 30, 0); 

Button okButton=new Button(this); 
okButton.setText("some text"); 
ll.addView(okButton, layoutParams); 
+0

También es posible dar los márgenes de los widgets en el código. –

+6

gracias por un ejemplo de código al punto: mucho más beneficioso que las descripciones –

+24

Parece que los parámetros de margen se establecen en píxeles. ¿Alguna forma de configurarlos en dps? –

62

Así que trabaja muy bien, pero ¿cómo en la tierra le da a los márgenes de los botones de modo hay espacio entre ellos?

Llama al setMargins() en el objeto LinearLayout.LayoutParams.

He intentado utilizar LinearLayout.MarginLayoutParams, pero que no tiene ningún elemento de peso por lo que no buena.

LinearLayout.LayoutParams es una subclase de LinearLayout.MarginLayoutParams, como se indica en la documentation.

¿Es esto imposible?

no sería la primera tarea Android diseño sólo se puede hacer en XML

Usted es bienvenido a suministrar prueba de esta afirmación.

Personalmente, no estoy al tanto de nada que solo se pueda lograr a través de XML y no a través de métodos Java en el SDK. De hecho, por definición, todo tiene que ser factible a través de Java (aunque no necesariamente a través de métodos accesibles mediante SDK), ya que XML no es un código ejecutable. Pero, si es consciente de algo, indíquelo, porque ese es un error en el SDK que debería arreglarse algún día.

+2

Ha, vale, ahora lo entiendo. Estaba perdiendo un poco en el sistema de diseño, que es bastante complicado. No creo que de todos modos haya que configurar layout_widgth/height en tiempo de ejecución. – Timmmm

+2

Y no hay forma de establecer el estilo: http://stackoverflow.com/questions/2016249/how-to-programmatically-setting-style-attribute-in-a-view – Timmmm

+1

No he tenido problemas para establecer el ancho y altura en tiempo de ejecución a través de 'LayoutPararms'. Yo términos de estilos ... sí, bueno, hay una razón por la que no los uso. :-) – CommonsWare

28

Para añadir márgenes directamente a los elementos (algunos artículos permiten la edición directa de los márgenes), que puede hacer:

LayoutParams lp = ((ViewGroup) something).getLayoutParams(); 
if(lp instanceof MarginLayoutParams) 
{ 
    ((MarginLayoutParams) lp).topMargin = ...; 
    ((MarginLayoutParams) lp).leftMargin = ...; 
    //... etc 
} 
else 
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName()); 

... esto funciona sin necesidad de conocer/editar el diseño circundante. Tenga en cuenta la comprobación de "instancia de" en caso de que intente ejecutar esto en contra de algo que no admite márgenes.

+2

Es exactamente lo que estoy buscando. – djdance

+2

Más precisa y aplicable que la respuesta más votada/aceptada ... – Rick

7

probar este

LayoutParams params = new LayoutParams(
      LayoutParams.WRAP_CONTENT,  
      LayoutParams.WRAP_CONTENT 
    ); 
    params.setMargins(left, top, right, bottom); 
    yourbutton.setLayoutParams(params); 
+1

esto no funciona para mí .. – Nik

19

Debido a la variación en pixel de la pantalla dispositivo densidades su bueno utilizar siempre DIP unidad para establecer margen programación. Como below_

//get resources 
Resources r = getResources(); 
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); 
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); 
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics()); 
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics()); 

//get layout params... 
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin)); 

//set margin... 
yourLayoutTOsetMargin.setLayoutParams(params); 

Espero que esto ayude.

8

que han establecido los márgenes utilizando directamente debajo de código

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout); 
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);    
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params); 

Lo único que aquí es darse cuenta de que LayoutParams deben importarse para android.widget.RelativeLayout.LayoutParams siguiente paquete, o de lo contrario habrá un error.

3
/* 
* invalid margin 
*/ 
private void invalidMarginBottom() { 
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams(); 
    lp.setMargins(0, 0, 0, 0); 
    frameLayoutContent.setLayoutParams(lp); 
} 

usted debe ser mercancías del tipo de viewGroup.In de la opinión de que el código anterior, por ejemplo, quiero cambiar el margen de la FrameLayout, y el grupo de vista del FrameLayout es un RelativeLayout, por lo que necesita encubiertas para (RelativeLayout.LayoutParams)

5
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams(); 
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
+2

"Si bien este código puede responder la pregunta, es mejor incluir aquí la explicación del código. – xenteros

0

Aquí una solución única línea:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue)); 
2

Prueba esto:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); 
params.width = 250; 
params.leftMargin = 50; 
params.topMargin = 50; 
Cuestiones relacionadas