web-dev-qa-db-fra.com

Android: modifier la position absolue d'une vue par programme

Si vous utilisez un AbsoluteLayout (je sais qu'il est obsolète, mais que c'était le seul moyen de résoudre mon problem ), vous pouvez donner à la variable childViews les balises Android:layout_x et Android:layout_y pour définir leur position absolue dans la variable AbsoluteLayout.

Cependant, je ne souhaite pas définir ces informations dans le fichier XML, car je ne les connais qu'au moment de l'exécution. Alors, comment puis-je définir ces paramètres au moment de l'exécution par programme? Je ne vois aucune méthode dans la vue telle que view.setLayoutX(int x) ou quelque chose du genre.

Voici mon XML, qui fonctionne bien, lorsque je définis les valeurs layout_x et 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>

En fait, je ne veux plus définir aucun bouton dans le fichier XML, mais plutôt récupérer des informations via la télécommande et ajouter des boutons en fonction de ces informations.

Voici la partie du code que j'utilise donc dans ma onCreateMethod pour ajouter ces boutons:

  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);
  }
21
Pascal Klein

Utilisez la version de addView qui prend LayoutParams :

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

En réponse à votre commentaire sur la réponse de Mayra, j'ai eu un problème similaire avec RelativeLayout au lieu de AbsoluteLayout. La solution consistait à utiliser une méthode similaire et à la transtyper en tant que type de présentation. Quelque chose comme ça: 

LayoutParams params = (Android.widget.RelativeLayout.LayoutParams) this.generateDefaultLayoutParams();
params.height = 360;
params.width = 360;
params.addRule(CENTER_IN_PARENT);
this.addView(board, params);

Cela m'a pris une éternité pour comprendre cela, alors je voulais le poster ici pour quelqu'un d'autre s'il en avait besoin.

10
Amplify91

J'ai eu le même problème mais j'ai trouvé une solution légèrement différente.

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

Et si vous savez quoi utiliser pour "fill_parent" (indice essayez -1), vous pouvez utiliser ces constantes pour la largeur et la hauteur.

5
Lauri

Je ne sais pas pourquoi, mais en déplaçant les bords supérieur et gauche, Android garde les bords droit et inférieur au même endroit. Comme je ne pouvais pas changer correctement la largeur et la hauteur (l'image disparaissait), j'ai utilisé this :

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

Je ne sais pas si c'est la meilleure façon, mais a travaillé pour moi. Je l'ai testé dans la version 2.2+ et fonctionne bien!

Vous devez importer Android.widget.LinearLayout.LayoutParams; parce que la valeur par défaut est LayoutParams de ViewGroup (par Davit T )

0
Rafael Brasil

les réponses ci-dessus sont exactes, mais celle-ci serait plus parfaite

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)
0
Asthme