Android:如何通过代码根据另一个TextView设置文本大小
问题
我有两个TextView:其中tvMovieRating设置了固定高度及自动调整文本大小属性,tvMovieDescriptionList是高度为wrap_content的多行普通TextView。我希望通过代码让tvMovieDescriptionList的文本大小与tvMovieRating一致,尝试了代码binding.tvMovieDescriptionList.textSize = binding.tvMovieRating.textSize但未生效,寻求解决方法。
相关布局代码如下:
<androidx.appcompat.widget.AppCompatTextView android:id="@+id/tvMovieRating" android:layout_width="match_parent" android:layout_height="@dimen/tvOthersActivityMovieHeight" android:layout_marginStart="@dimen/text_view_movie_description_margin_start" android:layout_marginHorizontal="@dimen/mainCLMarginActivityMovie" android:text="@string/movieRatingHint" android:textColor="@color/white" app:autoSizeMaxTextSize="@dimen/all_auto_max_text_sizes" app:autoSizeMinTextSize="@dimen/all_auto_min_text_sizes" app:autoSizeStepGranularity="@dimen/all_auto_size_step_granularities" app:autoSizeTextType="uniform" app:layout_constraintTop_toBottomOf="@id/tvMovieNameAndDate" /> <TextView android:id="@+id/tvMovieDescriptionList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/text_view_movie_description_margin_start" android:layout_marginHorizontal="@dimen/mainCLMarginActivityMovie" android:textSize="268sp" android:text="@string/lorem_ispum" android:textColor="@color/white" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvNonChangeableDescriptionText" />
解决方法
- 问题根源:开启自动调整文本大小的
tvMovieRating,直接调用textSize获取的是初始配置的尺寸(或最大允许尺寸),并非最终显示的真实文本大小。 - 正确获取实际文本尺寸:
使用TextViewCompat.getAutoSizeTextSize()方法获取自动调整后的真实像素值,再转换为sp单位赋值给目标TextView:val actualSizePx = TextViewCompat.getAutoSizeTextSize(binding.tvMovieRating) binding.tvMovieDescriptionList.textSize = actualSizePx / resources.displayMetrics.scaledDensity - 保证执行时机:
需在tvMovieRating完成布局、自动调整文本大小完成后执行代码,可通过post()实现:binding.tvMovieRating.post { val actualSizePx = TextViewCompat.getAutoSizeTextSize(binding.tvMovieRating) binding.tvMovieDescriptionList.textSize = actualSizePx / resources.displayMetrics.scaledDensity } - 动态内容适配:
如果tvMovieRating的文本会动态变化,可添加布局监听,实时同步文本大小:binding.tvMovieRating.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> val actualSizePx = TextViewCompat.getAutoSizeTextSize(binding.tvMovieRating) binding.tvMovieDescriptionList.textSize = actualSizePx / resources.displayMetrics.scaledDensity }
内容的提问来源于stack exchange,提问作者Mark George
相关产品推荐
相关产品推荐

