1

circleimageviews 및 텍스트 뷰를 프로그래밍 방식으로 추가하는 제약 레이아웃보기가 있습니다. 그러나 그렇게하면 UI가 전혀 영향을받지 않으며 실수를 찾을 수 없습니다. 누군가가 그 문제를 도와 주면 감사하겠습니다.안드로이드 - 새로 추가 된 imageviews 및 textviews에 제약 조건 설정

필자는 필자가 필요로하는 제약 조건을 설정하는 또 다른 함수를 호출 한 후 모든 이미지 뷰와 텍스트 뷰를 레이아웃에 추가하는 함수를 사용합니다.

UI 디자인에 관해서는 이미지 뷰를 3 개의 열로 구성된 테이블로 표시하고 런타임 중에 행을 결정하고 싶습니다. 필요할 때마다 서로 옆에 배치하여 이미지를 표시합니다. 제약 조건 세트 사용 그리고 각 이미지보기 위의 텍스트보기

내 이름은 여기에 내 코드입니다 : 당신은 당신이보기를 추가 할 때마다 PARAMS 레이아웃의 새로운 세트를 만들 필요가

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); 
} 
+0

'ConstraintLayout'의 이전 버전에서는'ConstraintSet' 처리를 위해 왼쪽/오른쪽을 사용하지 않았습니다. [이 버그 신고] (https://issuetracker.google.com/issues/62154545)를 참조하십시오. 최신 버전의 ConstraintLayout을 사용하거나 왼쪽/오른쪽 대신 시작/끝을 사용하십시오. 이것은 귀하의 문제 일 수 있습니다. – Cheticamp

+0

또한'friendsConstraintLayout'이 생성 되었습니까? 찾고있는 XML의 일부입니까, 아니면 코드로 작성하고 있습니까? – Cheticamp

+0

@Cheticamp 그것은 이미 정의 된 xml의 일부입니다. 처음에는 자식이 없으며 프로그래밍 방식으로 코드에 추가합니다. 지금 말한 것을 테스트 할 것입니다! –

답변

1

가. 연속적으로 추가 된 각각의 뷰는 이전에 추가 된 뷰의 레이아웃 매개 변수를 손상시킵니다. 다음과 같은 것을 수행이 비록

//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); 

것은 지금 당신에게 문제의 원인이되지 않을 수 있습니다, 그것은 미래에 수 나는 ID로 제로를 사용하지 않는 것입니다.

+0

정말 고마워요! –