2017-10-20 5 views
2

histoiresetLayoutParams sur ConstraintLayout ne change pas la taille

J'ai 2 textviews, l'un sur l'autre:

XXXXXXXXXXXX[TextView1] 
XXXXXXXXXXXX[TextView2] 
  • Les deux TextViews Aligne droite. (D'où le XXX ci-dessus)
  • TextView1 a une couleur de fond.
  • TextView2 est toujours plus longue que TextView1
  • gauche de TextView1 doit être aligné avec TextView2

Je les 4 ci-dessus exigences. Maintenant tout fonctionne bien en utilisant ConstraintLayout, où la gauche de TextView1 est contrainte à la gauche de TextView2, et la largeur de TextView2 est wrap_content.

Mais maintenant il est la 5ème exigence:

  • TextView2 peut disparaître, laissant derrière TextView1.

setVisibility(GONE) ne fonctionne pas, car TextView2 doit être wrap_content. il deviendra 0 en largeur et donc TextView1 aussi bien (depuis sa gauche est contraint à la gauche de TextView2)

Alors j'ai essayé de régler la hauteur de TextView2 à 0, en utilisant le code ci-dessous:

ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)textView2.getLayoutParams(); 
    lp.width = widthInPixelOrConstant; 
    textView2.setLayoutParams(lp); 

Oops, Rien ne se passe. TextView2 reste là, comme si rien ne s'était passé. J'ai googlé pendant une demi-heure, et a finalement décidé d'envelopper TextView2 dans un LinearLayout.

Et puis en utilisant le code ci-dessous pour régler la hauteur de TextView2 à 0:

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)view.getLayoutParams(); 
    lp.width = widthInPixelOrConstant; 
    view.setLayoutParams(lp); 

...... Il fonctionne !!!

La question

Donc, apparemment, nous ne pouvons pas utiliser ce que nous avons utilisé avant - setLayoutParams pour tenter de modifier la hauteur ou la largeur de l'enfant d'un ConstraintLayout lors de l'exécution.
Mais alors, envelopper TextView2 dans un LinearLayout est vraiment stupide.
Est-ce que quelqu'un sait comment modifier la largeur ou la hauteur d'un enfant de ConstraintLayout lors de l'exécution?

+0

Pouvez-vous partager la mise en page entière? – Mehmed

Répondre

0

Essayez d'ajouter des contraintes à l'exécution, comme ceci:

//Define some variables 
TextView textView1; 
TextView textView2; 
ConstraintLayout constraintLayout; 

//Initialize them, and so some stuff 
textView1 = (TextView) findViewById(R.id.text1); 
textView2 = (TextView) findViewById(R.id.text2); 
constraintLayout = (ConstraintLayout) findViewById(R.id.constraintLayout); 

int x = 200; //set some width 
int y = 200; //Set some height   

ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
      ConstraintLayout.LayoutParams.WRAP_CONTENT, 
      ConstraintLayout.LayoutParams.WRAP_CONTENT); 

lp.width = x; 
lp.height = y; 

//moves TextView1's left to align with TextView2's left 
lp.editorAbsoluteX = ((int) textView2.getX());  

textView1.setLayoutParams(lp); 

ConstraintSet constraintSet = new ConstraintSet(); 
constraintSet.clone(constraintLayout);   

constraintSet.connect(R.id.text1,ConstraintSet.LEFT,R.id.text2,ConstraintSet.LEFT,0); 
constraintSet.connect(R.id.text2,ConstraintSet.TOP,R.id.text1,ConstraintSet.BOTTOM,0); 

constraintSet.applyTo(constraintLayout); 

J'espère que ça aide!

+0

Cela ne fonctionne pas pour moi ... Non seulement la hauteur ne change pas, les contraintes sont également brisées. –

+0

Vous pouvez ajouter des contraintes lors de l'exécution et les ignorer dans la mise en page xml, vérifier ma réponse mise à jour et voir s'il y a quelque chose qui peut vous aider. – Zerato