Android: Cambia la posición absoluta de una vista mediante programación

Si utilizas un AbsoluteLayout (sé que está obsoleto, pero era la única manera de resolver mi problema ) puedes darle al niño la etiqueta android:layout_x y android:layout_y para establecer su posición absoluta dentro de AbsoluteLayout .

Sin embargo, no quiero establecer esta información en el xml, porque sólo 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.

Aquí está mi XML, que funciona bien, cuando establezco los valores de 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, no quiero establecer ningún botón dentro del xml más, sino más bien recuperar alguna 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í 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); } 

Utiliza la versión de addView que toma LayoutParams :

 LayoutParams params = mLayout.generateLayoutParams(); params.x = remoteObject.x; params.y = remoteObject.y; mLayout.addView(button, params); 

En respuesta a su comentario sobre la respuesta de Mayra, tuve un problema similar con RelativeLayout en lugar de AbsoluteLayout. La solución era usar un método similar y lanzarlo como su tipo de disposición. 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 para entender esto, así que quería publicarlo aquí para alguien más si lo necesitaban.

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é utilizar para "fill_parent" (sugerencia try -1), entonces puede usar esas constantes para el ancho y la altura.

No sé por qué, pero al mover los bordes superior e izquierdo de 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 esto :

 LayoutParams layoutParams=new LayoutParams(width, height); layoutParams.leftMargin = newLeft; layoutParams.topMargin = newTop; imageView.setLayoutParams(layoutParams); 

No sé si es la mejor manera, pero trabajó para mí. ¡Lo he probado en 2.2+ y funciona bien!

Debe importar android.widget.LinearLayout.LayoutParams; Porque el valor predeterminado es LayoutParams de ViewGroup (por Davit T )

Las respuestas anteriores son correctas. Pero ésta 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) 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.