2 votes

Android - Définition de contraintes pour les vues d'image et les vues de texte nouvellement ajoutées

J'ai une vue de mise en page de contrainte où j'ajoute des vues d'images circulaires et de texte de manière programmatique, Cependant, lorsque je fais cela, l'interface utilisateur n'est pas du tout affectée, je ne peux pas trouver l'erreur et je serais reconnaissant si quelqu'un pouvait m'aider avec ce problème.

J'utilise une fonction pour ajouter toutes les vues d'image et de texte à ma mise en page, après quoi j'appelle une autre fonction pour définir les contraintes dont j'ai besoin.

En ce qui concerne ma conception de l'interface utilisateur, je veux afficher les vues d'images comme un tableau composé de 3 colonnes, et les lignes sont déterminées pendant l'exécution, je le fais en les plaçant les unes à côté des autres et en dessous des autres si nécessaire en utilisant un ensemble de contraintes. Et au-dessus de chaque vue d'image se trouve le nom dans la vue de texte

Voici mon code :

private void initializeFriendsInImageViews(){
    friendsImageViews=new ArrayList<ImageView>();
    friendNamesTextViews=new ArrayList<TextView>();

    //Initializing Layout params
    ConstraintLayout.LayoutParams textViewLayoutParams = new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    ConstraintLayout.LayoutParams circleImageViewLayoutParams = new ConstraintLayout.LayoutParams(220, 220);

    //Declaring both views
    CircleImageView friendPic;
    TextView friendName;

    for(int i=0; i<countFriends; i++) {
        //Initializing both views
        friendPic = new CircleImageView(getActivity());
        friendName = new TextView(getActivity());

        //Setting IDs
        friendPic.setId(i);
        friendName.setId(countFriends+i);

        //Setting layout params
        friendPic.setLayoutParams(circleImageViewLayoutParams);
        friendName.setLayoutParams(textViewLayoutParams);

        //Setting border
        friendPic.setBorderColor(ContextCompat.getColor(getActivity(), R.color.border_grey));
        friendPic.setBorderWidth(8);

        //Load friend picture into imageview
        Picasso.with(getActivity()).load(Uri.parse(friendsPicURLs.get(i))).transform(new CircleTransform()).into(friendPic);

        //Load friend name into text view
        friendName.setText(friendNames.get(i));

        //add image view to list of image views
        friendsImageViews.add(friendPic);
        //add text view to list of text views
        friendNamesTextViews.add(friendName);

        //Add image view to my layout
        friendsConstraintLayout.addView(friendPic);
        //Add text view to my layout
        friendsConstraintLayout.addView(friendName);
    }
    addConstraints();
}

private void addConstraints(){
    //Initializing constraint set
    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(friendsConstraintLayout);
    for (int i=0;i<countFriends;i++){
        //positioning a new row of friends (circle image views)
        if (i==0){
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.LEFT,friendsConstraintLayout.getId(),ConstraintSet.LEFT,15);
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.TOP,friendsConstraintLayout.getId(),ConstraintSet.TOP,15);
        }
        else if ((i+1)<=3){
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.LEFT,friendsImageViews.get(i-1).getId(),ConstraintSet.RIGHT);
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.TOP,friendsImageViews.get(i-1).getId(),ConstraintSet.TOP);
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.BOTTOM,friendsImageViews.get(i-1).getId(),ConstraintSet.BOTTOM);
        }
        else if ((i+1)>3){
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.LEFT,friendsImageViews.get(i-3).getId(),ConstraintSet.LEFT);
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.RIGHT,friendsImageViews.get(i-3).getId(),ConstraintSet.RIGHT);
            constraintSet.connect(friendsImageViews.get(i).getId(),ConstraintSet.TOP,friendsImageViews.get(i-3).getId(),ConstraintSet.BOTTOM);
        }

        //positioning friend names
        constraintSet.connect(friendNamesTextViews.get(i).getId(),ConstraintSet.LEFT,friendsImageViews.get(i).getId(),ConstraintSet.LEFT);
        constraintSet.connect(friendNamesTextViews.get(i).getId(),ConstraintSet.RIGHT,friendsImageViews.get(i).getId(),ConstraintSet.RIGHT);
        constraintSet.connect(friendNamesTextViews.get(i).getId(),ConstraintSet.BOTTOM,friendsImageViews.get(i).getId(),ConstraintSet.TOP);
    }
    //Apply Constraints
    constraintSet.applyTo(friendsConstraintLayout);
}

1voto

Cheticamp Points 22529

Vous devez créer un nouvel ensemble de paramètres de mise en page chaque fois que vous ajoutez une vue. Chaque vue ajoutée successivement écrase les paramètres de mise en page des vues précédemment ajoutées. Faites quelque chose comme ce qui suit :

//Setting layout params
circleImageViewLayoutParams = new ConstraintLayout.LayoutParams(220, 220);
friendPic.setLayoutParams(circleImageViewLayoutParams);
textViewLayoutParams = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
friendName.setLayoutParams(textViewLayoutParams);

Même si cela ne vous pose pas de problème pour l'instant, cela pourrait le faire à l'avenir : J'éviterais d'utiliser le zéro comme identifiant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X