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);
}
Utilisez la version de addView qui prend LayoutParams :
LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
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.
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.
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 )
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)