web-dev-qa-db-fra.com

Comment définir de manière dynamique la position de vue dans Android?

Comment puis-je changer la position de la vue par le code? Comme changer sa position X, Y. C'est possible?

85
AB1209

Pour tout ce qui se trouve en dessous de Honeycomb (API niveau 11), vous devrez utiliser setLayoutParams(...)

Si vous pouvez limiter votre assistance à Honeycomb et plus, vous pouvez utiliser les fonctions setX(...), setY(...), setLeft(...), setTop(...), etc.

108
Perishable Dave

Oui, vous pouvez définir de manière dynamique la position de la vue dans Android. De même, vous avez une ImageView dans LinearLayout de votre fichier xml. Vous pouvez donc définir sa position par le biais de LayoutParams. Mais assurez-vous de prendre LayoutParams en fonction de la mise en page prise dans votre fichier xml. Il existe différents LayoutParams en fonction de la mise en page prise.

Voici le code à définir:

    LayoutParams layoutParams=new LayoutParams(int width, int height);
    layoutParams.setMargins(int left, int top, int right, int bottom);
    imageView.setLayoutParams(layoutParams);

J'espère que cela vous sera utile de définir votre position.

41
AkashG

Il existe déjà différentes réponses valables, mais aucune ne semble suggérer correctement la ou les méthodes à utiliser, auquel cas, à l'exception des restrictions de niveau d'API correspondantes:

  • Si vous pouvez attendre un cycle de présentation et que le groupe de vues parent prend en charge MarginLayoutParams (ou une sous-classe), définissez marginLeftmarginTop en conséquence.

  • Si vous devez modifier la position immédiatement et de manière persistante (par exemple, pour une ancre PopupMenu), appelez en outre layout(l, t, r, b) avec les mêmes coordonnées. Ceci préempte ce que le système de mise en page confirmera plus tard.

  • Pour les modifications immédiates (temporaires) (telles que les animations), utilisez plutôt setX()/setY(). Dans les cas où la taille du parent ne dépend pas de WRAP_CHILDREN, il pourrait être correct d’utiliser exclusivement setX()/setY().

  • _/Jamais utilisez setLeft()setRight()/setBottom()/setTop(), voir ci-dessous.

_/Background: Les champs mLeft/mTop/mBottom/mRight sont remplis à partir des LayoutParams correspondants dans layout (). La mise en page est appelée implicitement et de manière asynchrone par le système de présentation de vues Android. Ainsi, définir MarginLayoutParams semble être le moyen le plus sûr et le plus propre de définir la position de manière permanente. Cependant, le décalage de présentation asynchrone peut poser problème dans certains cas, par exemple. lorsque vous utilisez une vue pour rendre un curseur, celui-ci est supposé être repositionné et servir d’ancre PopupMenu en même temps. Dans ce cas, appeler layout() a bien fonctionné pour moi. 

Les problèmes avec setLeft() et setTop() sont les suivants:

  • Les appeler seuls ne suffit pas - vous devez également appeler setRight() et setBottom() pour éviter d'étirer ou de réduire la vue.

  • L'implémentation de ces méthodes semble relativement complexe (= faire un travail pour prendre en compte les changements de taille de vue causés par chacune d'elles)

  • Ils semblent provoquer des problèmes étranges avec les champs de saisie: Le clavier numérique souple EditText n'autorise parfois pas les chiffres

setX() et setY() fonctionnent en dehors du système de présentation, et les valeurs correspondantes sont traitées comme un décalage supplémentaire par rapport aux valeurs gauche/haut/bas/droite déterminées par le système de présentation, ce qui déplace la vue en conséquence. Ils semblent avoir été ajoutés pour les animations (où un effet immédiat sans passer par un cycle de mise en page est requis). 

22
Stefan Haustein

Il existe une bibliothèque appelée NineOldAndroids , qui vous permet d’utiliser la bibliothèque d’animation Honeycomb jusqu’à la première version.

Cela signifie que vous pouvez définir left, right, translationX/Y avec une interface légèrement différente.

Voici comment cela fonctionne:

ViewHelper.setTranslationX(view, 50f);

Vous utilisez simplement les méthodes statiques de la classe ViewHelper, transmettez la vue et la valeur de votre choix.

18
Ben

Je recommanderais d'utiliser setTranslationX et setTranslationY. Je commence tout juste à commencer moi-même, mais cela semble être le moyen le plus sûr et préféré de déplacer une vue. Je suppose que cela dépend beaucoup de ce que vous essayez exactement de faire, mais cela fonctionne bien pour moi pour l'animation 2D.

15
brianmearns

Vous pouvez essayer d'utiliser les méthodes suivantes si vous utilisez HoneyComb Sdk (API niveau 11).

view.setX(float x);

Le paramètre x est la position visuelle x de cette vue.

view.setY(float y);

Le paramètre y est la position visuelle y de cette vue.

J'espère que cela vous sera utile. :)

11
Chickenrice

Pour prendre en charge tous les niveaux d’API, vous pouvez utiliser it comme ceci:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
5
Orr

Utilisez LayoutParams . Si vous utilisez un LinearLayout, vous devez importer Android.widget.LinearLayout.LayoutParams, sinon importez la version appropriée de LayoutParams pour la présentation que vous utilisez, sinon cela provoquera un ClassCastException , puis:

LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);

NB: Notez que vous pouvez aussi utiliser imageView.setLeft (int dim), MAIS CECI NE FIXERA PAS la position du composant, il ne définira que la position du bord gauche du composant, le reste restera à la Même position.  

4
Ale Muzzi

Définissez la position gauche de cette vue par rapport à son parent:

view.setLeft(int leftPosition);

Définissez la bonne position de cette vue par rapport à son parent:

view.setRight(int rightPosition);

Définissez la position supérieure de cette vue par rapport à son parent:

view.setTop(int topPosition);

Définissez la position inférieure de cette vue par rapport à son parent:

view.setBottom(int bottomPositon);

Les méthodes ci-dessus permettent de définir la position de la vue par rapport à son parent.

4
Balaji.K

Utilisez RelativeLayout, placez votre vue dessus, obtenez l’objet RelativeLayout.LayoutParams de votre vue et définissez les marges selon vos besoins. Ensuite, appelez requestLayout() à votre avis. C'est la seule façon que je connaisse.

3
glodos