You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:00:59