ConstraintLayout中的Textview没有调整大小

问题描述:

我在ConstraintLayout中有一个TextView,它漂浮在图像上,并且样式看起来像一个徽章。文本视图使用wrap_content,有时有2个字母,有时是3.有时需要更新TextView。发生这种情况时,TextView的容器不会动态调整大小。这意味着如果新文本是2个之前的3个字符,它现在看起来太大了,如果它是2个字符,当它是3时,它会剪切文本。ConstraintLayout中的Textview没有调整大小

我怎样才能让TextView适当调整大小?在问题

TextView的被称为@id/attendance i中的布局:其中视图膨胀和分配的代码

<?xml version="1.0" encoding="utf-8"?> 

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/image_holder" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:orientation="vertical"> 

    <com.pkmmte.view.CircularImageView 
     android:id="@+id/image" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_marginBottom="1dp" 
     tools:background="@color/accent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintBottom_toTopOf="@+id/first_name" 
     app:border="true" 
     app:border_color="@color/dark_gray" 
     app:border_width="2dp" 
     app:shadow="false" /> 


    <TextView 
     android:id="@+id/attendance" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="8dp" 
     android:layout_marginLeft="40dp" 
     android:minWidth="15dp" 
     android:maxWidth="50dp" 
     android:minHeight="20dp" 
     android:maxHeight="20dp" 
     android:padding="12dp" 
     tools:text="100" 
     app:layout_constraintStart_toStartOf="@id/image" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintTop_toTopOf="@id/image" 
     app:layout_goneMarginTop="20dp" 
     tools:background="@color/green_complete" 
     android:shadowColor="@color/black" 
     android:textColor="@color/white" 
     android:textSize="14sp" /> 
    <TextView 
     android:id="@+id/first_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:ellipsize="end" 
     android:maxLines="1" 
     tools:text="Suzie" 
     app:layout_constraintStart_toStartOf="@id/image" 
     app:layout_constraintEnd_toEndOf="@id/image" 
     app:layout_constraintTop_toBottomOf="@id/image" 
     app:layout_constraintBottom_toTopOf="@+id/last_name" 
     android:layout_marginTop="2dp" 
     android:textColor="@color/white" 
     android:textSize="12sp" 
     android:textStyle="bold"/> 

    <TextView 
     android:id="@+id/last_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginBottom="4dp" 
     app:layout_constraintTop_toBottomOf="@id/first_name" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintStart_toStartOf="@id/image" 
     app:layout_constraintEnd_toEndOf="@id/image" 
     android:ellipsize="end" 
     android:maxLines="1" 
     tools:text="Cue" 
     android:textColor="@color/white" 
     android:textSize="12sp" 
     /> 

</android.support.constraint.ConstraintLayout> 

节。这是在视图首次创建时以及更新时调用的。问题TextView是被gradeText

public View getView(View existingView, final StudentAssignmentGrade item) { 

      final StudentGrade grade = item.getGrade(); 

      final ViewHolder holder; 

      if (existingView == null) { 
       holder = new ViewHolder(); 
       existingView = inflater.inflate(R.layout.student_view_grading, staggeredGridView, false); 

       holder.firstNameText = (TextView) existingView.findViewById(R.id.first_name); 
       holder.lastNameText = (TextView) existingView.findViewById(R.id.last_name); 
       holder.studentImage = (CircularImageView) existingView.findViewById(R.id.image); 
       //This is the textView 
       holder.gradeText = (TextView) existingView.findViewById(R.id.attendance); 


       existingView.setTag(holder); 
      } else { 
       holder = (ViewHolder) existingView.getTag(); 
      } 

      //set other TextViews 


      if (item.getGrade().getMark() != null) { 
       holder.gradeText.setVisibility(View.VISIBLE); 

       String formattedMark = ""; 

       if(grade.getMark() != null) 
        formattedMark = grade.getMark().replaceAll("\\..*$", ""); 

       if(formattedMark.isEmpty()) 
        formattedMark = "?"; 

       holder.gradeText.setText(" " + formattedMark + " "); 

       holder.studentImage.setBorderColor(mContext.getResources().getColor(R.color.white)); 
       holder.studentImage.setBorderWidth(2); 
      } else { 
       holder.gradeText.setVisibility(View.GONE); 

       holder.studentImage.setBorderColor(mContext.getResources().getColor(R.color.dark_gray)); 
       holder.studentImage.setBorderWidth(2); 
      } 


      CourseGradeDisplay.PerformanceLevel performanceLevel = null; 

      float gradePercent = item.getGrade().getPercentageEarned(); 
      final CourseGradeDisplay gradeDisplay = courseGradeDisplays.get(item.getCourseId()); 

      if(gradeDisplay != null && gradePercent >= 0.0f) { 
       for (CourseGradeDisplay.PerformanceLevel level : gradeDisplay.getPerformanceLevels()) { 
        if (gradePercent >= level.getMinRange() && gradePercent <= level.getMaxRange()) { 
         performanceLevel = level; 
         break; 
        } 
       } 
      } 

      int iconColor = R.color.black; 

      if(performanceLevel != null) { 
       switch (performanceLevel.getColor()) { 
        case 4: iconColor = R.color.grade_output_blue; break; 
        case 3: iconColor = R.color.grade_output_green; break; 
        case 2: iconColor = R.color.grade_output_yellow; break; 
        case 1: iconColor = R.color.grade_output_red; break; 
        default: iconColor = R.color.black; 

       } 
      } 


      //set icon and color 
      Drawable iconDrawable = mContext.getResources().getDrawable(R.drawable.round_corner_bg); 
      iconDrawable.setColorFilter(new 
        PorterDuffColorFilter(mContext.getResources().getColor(iconColor), PorterDuff.Mode.MULTIPLY)); 
      holder.gradeText.setBackgroundDrawable(iconDrawable); 





      holder.studentImage.setOnLongClickListener(new View.OnLongClickListener() { 
       ... 
      }); 


      try { 
       // .. set more listeners ... 
      } 
      return existingView; 
     } 

原来,一旦视图被添加到您的ViewGroup不能指望它来正确地调整自身在数据变化和WRAP_CONTENT在起作用。解决方案来自别人写的这个美妙的静态助手类。它在这里:https://github.com/ea167/android-layout-wrap-content-updater