studio resolucion que programacion pantalla paleta elementos ejemplo contenedores componentes aplicacion amontonados adaptar java android layout view margin

java - resolucion - Establecer márgenes en un LinearLayout programáticamente



que es view en programacion (10)

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

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

Intenté usar LinearLayout.MarginLayoutParams, pero eso no tiene ningún miembro de peso, así que no es bueno.

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

¿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 esta reclamación.

Personalmente, no tengo conocimiento de nada que solo pueda lograrse 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 de SDK), ya que XML no es un código ejecutable. Pero, si está consciente de algo, señálelo, porque ese es un error en el SDK que debería solucionarse algún día.

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:

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 diablos le das a los márgenes de los botones para que haya espacio entre ellos? Intenté usar LinearLayout.MarginLayoutParams , pero eso no tiene ningún miembro de weight , así que no es bueno. Y tampoco funciona si lo pasas lp en su constructor.

¿Es esto imposible? Porque seguro que lo parece, y no sería la primera tarea de diseño de Android que solo puede 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);


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

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


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 programáticamente. 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 los márgenes directamente usando el siguiente 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 aquí es notar que LayoutParams debe importarse para el siguiente paquete android.widget.RelativeLayout.LayoutParams , o de lo contrario habrá un error.


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 "instanceof" en caso de que intente ejecutar esto contra algo que no admita márgenes.


Prueba esto

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


Prueba esto:

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


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

debe estar al tanto del tipo de viewGroup de la vista. En el código anterior, por ejemplo, quiero cambiar el margen de frameLayout, y el grupo de view de frameLayout es un RelativeLayout , por lo que debe ocultarse a (RelativeLayout.LayoutParams)