web-dev-qa-db-fra.com

comment MODIFIER une mise en page de contraintes par programme?

J'ai une vue comme ci-dessous:

 <org.rayanmehr.atlas.shared.customview.CustomTextView
    Android:id="@+id/tvDownVoteCount"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="6dp"
    app:layout_constraintVertical_bias="0"
    app:layout_constraintTop_toBottomOf="@+id/anchorHelper"
    app:layout_constraintLeft_toRightOf="@+id/tvDownVoteIcon"
    app:layout_constraintBottom_toBottomOf="@+id/imgComment"
    />

comment puis-je modifier la valeur de app:layout_constraintVertical_bias ou de toute autre propriété de contrainte par programme sans avoir à nouveau défini l'ensemble des propriétés dans mon activité?

9
Amir Ziarati

Je viens de trouver la réponse dans ici et vous pouvez utiliser ConstraintSet pour réaliser ceci comme ci-dessous:

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(context, R.id.activity_constraint);
//for example lets change the vertical bias of tvDownVoteIcon
float biasedValue = 0.2f;
constraintSet.setVerticalBias(R.id.tvDownVoteIcon, biasedValue);
//you can do any other modification and then apply
constraintSet.applyTo( (ConstraintLayout) findViewById(R.id.activity_constraint));
6
Amir Ziarati

Voici ce que j'ai fait (pas besoin de ConstraintSet, on peut travailler directement sur les contraintes elles-mêmes):

ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) myView.getLayoutParams();
params.horizontalBias = 0.2f; // here is one modification for example. modify anything else you want :)
myView.setLayoutParams(params); // request the view to use the new modified params

cela a fonctionné comme un charme quand j'avais SeekBar et TextView dessous (aligné à gauche et à droite), et je voulais mettre à jour la position TextView pour qu'elle soit sous le curseur SeekBar, donc j'ai dû mettre à jour les paramètres de biais horizontal la SeekBar 's OnSeekBarChangeListener

8
Re'em

Avertissement: je n'ai pas utilisé cette fonctionnalité spécifique. Ceci est juste mon interprétation sur la façon dont j'essaierais de le faire.

Je pense que ce dont vous avez besoin est ConstraintSet . Après l'avoir obtenu, vous pouvez le modifier et l'appliquer à nouveau. Ceci est un exemple pertinent tiré de cet article .

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    val constraintSet1 = ConstraintSet()
    constraintSet1.clone(constraintLayout)
    val constraintSet2 = ConstraintSet()
    constraintSet2.clone(constraintLayout)
    constraintSet2.centerVertically(R.id.image, 0)

    var changed = false
    findViewById(R.id.button).setOnClickListener {
        TransitionManager.beginDelayedTransition(constraintLayout)
        val constraint = if (changed) constraintSet1 else constraintSet2
        constraint.applyTo(constraintLayout)
        changed = !changed
    }
}
0