当系统范围的字体缩放时,Android TextView不会包装内容

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述当系统范围的字体缩放时,Android TextView不会包装内容相关的知识,希望能为你提供帮助。
在我的应用程序中,我正在尝试调整此布局,以便在用户在android系统设置 - > 显示 - > 字体大小(或某些设备的辅助功能设置)中缩放系统范围的字体大小时可读。做一些挖掘我发现这会调整设备配置字体比例(getResources().getConfiguration.fontScale)从1.01.15
我在LinearLayout得到一些奇怪的行为,其中一个TextViews宽度被压碎,当它设置为wrap_content,并且也没有反映一组minWidth
通常看起来像

当系统范围的字体缩放时,Android TextView不会包装内容

文章图片
当字体缩放时,它看起来像
当系统范围的字体缩放时,Android TextView不会包装内容

文章图片

这是有问题的LinearLayout(为截图中的上下文添加注释)
< LinearLayout android:id="@+id/sectionPaintStatus" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="20dp" android:gravity="center_vertical" android:orientation="horizontal"> < !-- () 6 Paint Items --> < LinearLayout android:id="@+id/sectionPaintItemToggle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clipToPadding="false" android:gravity="center_vertical" android:orientation="horizontal" android:paddingBottom="5dp"> < android.support.design.widget.FloatingActionButton android:id="@+id/fabExpandPaintItems" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:rotation="180" android:src="https://www.songbingjia.com/android/@drawable/ic_collapse" app:elevation="2dp" app:fabSize="mini"/> < TextView android:id="@+id/tvPaintItemCount" style="@style/Label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" android:text="0 Paint Items" android:textSize="16sp"/> < ImageView android:id="@+id/imgPaintAreaWarning" android:layout_width="20dp" android:layout_height="match_parent" android:layout_marginStart="10dp" android:scaleType="centerInside" android:src="https://www.songbingjia.com/android/@drawable/ic_edit_warning2" android:visibility="invisible"/> < /LinearLayout> < !-- Inner layout to consume middle width and right align the rest --> < LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="end" android:orientation="horizontal"> < LinearLayout android:id="@+id/layoutPaintItemCount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="end" android:orientation="vertical" android:visibility="invisible"> < TextView android:id="@+id/tvPaintItemCountStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2" android:textSize="16sp" android:textStyle="bold"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Paint Items" android:textSize="16sp"/> < /LinearLayout> < ImageView android:layout_width="50dp" android:layout_height="50dp" android:layout_marginStart="30dp" android:scaleType="centerInside" android:src="https://www.songbingjia.com/android/@drawable/ic_time"/> < LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="end" android:orientation="vertical"> < TextView android:id="@+id/tvPaintTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2.5h" android:textSize="16sp" android:textStyle="bold"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Time" android:textSize="16sp"/> < /LinearLayout> < LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="30dp" android:layout_marginEnd="30dp" android:minWidth="70dp" android:gravity="end" android:orientation="vertical"> < TextView android:id="@+id/tvPaintTotal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="$123.22" android:textSize="16sp" android:textStyle="bold"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Total" android:textSize="16sp"/> < /LinearLayout> < /LinearLayout> < /LinearLayout>

【当系统范围的字体缩放时,Android TextView不会包装内容】为什么包含2个LinearLayouts的最后一个TextView没有正确包装内容?我尝试删除导致任何问题的minWidth incase并获得相同的结果。我不明白为什么所有其他布局都正确地包装它们的内容,但最后一个没有。
是否可以为缩放的系统范围字体添加资源文件夹?
编辑它似乎删除边距允许TextView包装适当的宽度,但显然我需要边距。
当系统范围的字体缩放时,Android TextView不会包装内容

文章图片

谁能解释这种奇怪的行为?
编辑解决事实证明我完全忘记了“绘制项目”标签和时间图标之间布局中的不可见元素。这导致我的水平空间不足。
答案您似乎已使用layout_width="match_parent"gravity="end"来对齐您的元素。
我假设在小型设备(或大文本)上,当没有足够的空间时,你想要“0 Paint Items”进行椭圆化,并且要在全宽度显示“时间”和“总计”字段。
为此,我们进行了以下更改:
首先,让sectionPaintItemToggle0dp宽度和layout_weight="1"- 这告诉Android“这应该填充尽可能多的空间”。
< LinearLayout android:id="@+id/sectionPaintItemToggle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" ... >

我删除了所有gravity="end"设置。
我改变了“内部布局”(根据评论)要有wrap_content宽度。
我删除了整个layoutPaintItemCount布局 - 我觉得你正在尝试一种不同的方式来做“N个绘画项目”布局。
最后,我们有类似的东西(我换了一个ImageView用于FAB并且只使用了我已经拥有的资源 - 我想我也改变了一些边距):
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout android:id="@+id/sectionPaintStatus" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="20dp" android:layout_marginStart="20dp" android:layout_marginTop="20dp" android:gravity="center_vertical" > < !-- () 6 Paint Items --> < LinearLayout android:id="@+id/sectionPaintItemToggle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:clipToPadding="false" android:gravity="center_vertical" android:orientation="horizontal" android:paddingBottom="5dp"> < ImageView android:id="@+id/fabExpandPaintItems" android:layout_width="48dp" android:layout_height="48dp" android:layout_margin="5dp" android:rotation="180" android:src="https://www.songbingjia.com/android/@drawable/ic_edit_black_24dp"/> < TextView android:id="@+id/tvPaintItemCount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="5dp" android:text="0 Paint Items" android:textSize="16sp"/> < ImageView android:id="@+id/imgPaintAreaWarning" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginStart="10dp" android:scaleType="centerInside" android:src="https://www.songbingjia.com/android/@drawable/ic_edit_black_24dp" android:visibility="invisible"/> < /LinearLayout> < !-- Inner layout to consume middle width and right align the rest --> < LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> < ImageView android:layout_width="50dp" android:layout_height="50dp" android:scaleType="centerInside" android:src="https://www.songbingjia.com/android/@drawable/ic_edit_black_24dp"/> < LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> < TextView android:id="@+id/tvPaintTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2.5h" android:textSize="16sp" android:textStyle="bold"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Time" android:textSize="16sp"/> < /LinearLayout> < LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="30dp" android:layout_marginStart="30dp" android:orientation="vertical"> < TextView android:id="@+id/tvPaintTotal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="$123.22" android:textSize="16sp" android:textStyle="bold"/> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Total" android:textSize="16sp"/> < /LinearLayout> < /LinearLayout> < /LinearLayout>

关键部分是说服Android,“N Paint Items”视图是你想缩小的视图。

    推荐阅读