Establecer márgenes en LinearLayout mediante progtwigción

Intento usar Java ( no XML ) para crear LinearLayout con botones que llenan la pantalla y tienen márgenes. Aquí hay un código que funciona sin márgenes:

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

Así que funciona bien, pero ¿cómo demonios le das a los botones márgenes para que haya espacio entre ellos? Intenté utilizar LinearLayout.MarginLayoutParams , pero eso no tiene ningún miembro de weight , así que no sirve. Y tampoco funciona si lo pasa lp en su constructor.

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

Aquí hay un pequeño 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); 

Así que funciona bien, pero ¿cómo demonios le das a los botones márgenes para que haya espacio entre ellos?

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

Intenté utilizar LinearLayout.MarginLayoutParams, pero eso no tiene ningún miembro de peso, así que no sirve.

LinearLayout.LayoutParams es una subclase de LinearLayout.MarginLayoutParams , como se indica en la documentación .

Es esto imposible?

No.

no sería la primera tarea de diseño de Android que solo puedes hacer en XML

Le invitamos a proporcionar prueba de este reclamo.

Personalmente, no estoy al tanto de nada que solo se pueda lograr a través de XML y no a través de los métodos de 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.

Para agregar márgenes directamente a los elementos (algunos elementos permiten la edición directa de los márgenes), 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.

Debido a la variación en las densidades de píxeles de la pantalla del dispositivo, es bueno usar siempre la unidad DIP para establecer el margen mediante progtwigción. Como abajo_

 //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

He configurado márgenes directamente usando el código a continuación

 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 hay que hacer aquí es observar que LayoutParams debe importarse para el siguiente paquete android.widget.RelativeLayout.LayoutParams , de lo contrario habrá un error.

Prueba esto

  LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ); params.setMargins(left, top, right, bottom); yourbutton.setLayoutParams(params); 
  MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams(); layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
 /* * invalid margin */ private void invalidMarginBottom() { RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams(); lp.setMargins(0, 0, 0, 0); frameLayoutContent.setLayoutParams(lp); } 

Debería tener en cuenta el tipo de viewGroup de la vista. En el código anterior, por ejemplo, quiero cambiar el margen de frameLayout, y el grupo de vistas de frameLayout es RelativeLayout , por lo que debe convertir a (RelativeLayout.LayoutParams)

Prueba esto:

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

Aquí una solución de una sola línea:

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