3

J'écris une vue personnalisée pour pouvoir utiliser les attributs XML personnalisés pour définir la marge et la taille d'une vue en fonction de ces attributs, tout a bien fonctionné jusqu'à la partie où les enfants de ConstraintLayout obtenir leurs marges et la taille déterminée par les valeurs personnalisées. Les marges ne font aucune différence et la vue reste dans le coin supérieur gauche de son ConstraintLayout parent. Quel pourrait être le problème? (L'image doit être 500PXs loin des limites de l'écran)Modification de la marge et de la taille des enfants de ConstraintLayout par programmation

if (hasCustomWidth || hasCustomHeight || hasCustomTopMargin || hasCustomRightMargin || hasCustomBottomMargin || hasCustomLeftMargin) { 
    if(((ViewGroup)getParent()) instanceof LinearLayout) { 
     LinearLayout.LayoutParams newLayoutParams = new LinearLayout.LayoutParams((int) Math.round(customWidth), (int) Math.round(customHeight)); 
     ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) newLayoutParams; 
     marginLayoutParams.setMargins((int) Math.round(customLeftMargin), (int) Math.round(customTopMargin), (int) Math.round(customRightMargin), (int) Math.round(customBottomMargin)); 
     setLayoutParams(newLayoutParams); 
    } else if(((ViewGroup)getParent()) instanceof ConstraintLayout) { 
     ConstraintLayout parentConstraintLayout = (ConstraintLayout)CustomAppCompatImageView.this.getParent(); 

     ConstraintLayout.LayoutParams newLayoutParams = new ConstraintLayout.LayoutParams((int) Math.round(customWidth), (int) Math.round(customHeight)); 

     ConstraintSet constraintSet = new ConstraintSet(); 

     constraintSet.clone(parentConstraintLayout); 

     constraintSet.connect(CustomAppCompatImageView.this.getId(), ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 500); 
     constraintSet.setMargin(CustomAppCompatImageView.this.getId(), ConstraintSet.LEFT, 500); 

     setLayoutParams(newLayoutParams); 
     constraintSet.applyTo(parentConstraintLayout); 

     parentConstraintLayout.invalidate(); 
    } else { 
     throw new RuntimeException("no listed parent LayoutParams subclass!"); 
    } 

    invalidate(); 
} 

Résultat:

enter image description here

Répondre

3

J'ai trouvé la solution: apparemment Android ne prend pas ConstraintSet.LEFT et ConstraintSet.RIGHT comme arguments appropriés et doit être remplacé par ConstraintSet.START et ConstraintSet.END.

+1

Oui, j'ai eu une situation très similaire et cela a bien fonctionné uniquement avec ConstraintSet.START et ConstraintSet.END –

+0

Merci sauvé ma vie. –