programacion - Android: Cambia la posición absoluta de una vista programáticamente
manual de android en pdf (5)
Si usas un AbsoluteLayout (sé que está en desuso, pero era la única forma de resolver mi problem ), puedes darle a los childViews la etiqueta android:layout_x
y android:layout_y
para establecer su posición absoluta dentro de AbsoluteLayout
.
Sin embargo, no quiero configurar esta información en el xml, porque solo los conozco en tiempo de ejecución. Entonces, ¿cómo puedo configurar estos parámetros en tiempo de ejecución mediante programación? No veo ningún método en la Vista como view.setLayoutX(int x)
o algo así.
Aquí está mi XML, que funciona bien, cuando establezco los valores layout_x
y layout_y
:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:src="@drawable/myImageView"
android:layout_width="1298px"
android:layout_height="945px"
android:layout_x="0px"
android:layout_y="0px" />
<Button
android:id="@+id/myButton1"
android:text="23"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="50px"
android:layout_y="300px"
android:tag="23"/>
<Button
android:id="@+id/myButton2"
android:text="48"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="50px"
android:layout_y="300px"
android:tag="48"/>
</AbsoluteLayout>
De hecho, ya no quiero configurar ningún botón dentro del xml, sino recuperar información a través del control remoto y agregar botones dependiendo de esa información.
Aquí está la parte del código que estoy usando, así que en mi onCreateMethod
para agregar estos botones:
for (MyRemoteObject remoteObject: list) {
Button button = new Button(this);
button.setOnClickListener (listener);
button.setTag(remoteObject.id);
button.setText(remoteObject.id);
// button.setLayoutX(remoteObject.x) ????
// button.setLayoutY(remoteObject.y) ????
myLayout.addView(button);
}
En respuesta a su comentario sobre la respuesta de Mayra, tuve un problema similar con RelativeLayout en lugar de AbsoluteLayout. La solución fue usar un método similar y convertirlo como su tipo de diseño. Algo como esto:
LayoutParams params = (android.widget.RelativeLayout.LayoutParams) this.generateDefaultLayoutParams();
params.height = 360;
params.width = 360;
params.addRule(CENTER_IN_PARENT);
this.addView(board, params);
Me tomó una eternidad resolver esto, así que quería publicarlo aquí para otra persona si lo necesitaban.
Las respuestas anteriores son correctas. Pero esta sería más perfecta.
AbsoluteLayout.LayoutParams layoutParams = new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.WRAP_CONTENT,AbsoluteLayout.LayoutParams.WRAP_CONTENT,DragLayer.int left_location,int top_location);
layout.addView(view,layoutParams)
No sé por qué, pero al mover los bordes superior e izquierdo, Android mantiene los bordes derecho e inferior en el mismo lugar. Como no pude cambiar el ancho y la altura correctamente (la imagen estaba desapareciendo), he usado this :
LayoutParams layoutParams=new LayoutParams(width, height);
layoutParams.leftMargin = newLeft;
layoutParams.topMargin = newTop;
imageView.setLayoutParams(layoutParams);
No sé si es la mejor manera, pero funcionó para mí. Lo he probado en 2.2+ y funciona bien!
Debe importar android.widget.LinearLayout.LayoutParams; porque el valor predeterminado es ViewProup''s LayoutParams (por Davit T )
Tuve el mismo problema pero encontré una solución algo diferente.
int width = 100, height = 50, x = 10, y = 20;
Button button = new Button(this);
AbsoluteLayout myLayout = (AbsoluteLayout)findViewById(R.id.myLayout);
myLayout.add(button, new AbsoluteLayout.LayoutParams(width, height, x, y));
Y si descubre qué usar para "fill_parent" (sugerencia de prueba -1), puede usar esas constantes para ancho y alto.
Use la versión de addView que toma LayoutParams :
LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);