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)