当系统范围的字体缩放时,Android TextView不会包装内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当系统范围的字体缩放时,Android TextView不会包装内容相关的知识,希望对你有一定的参考价值。
在我的应用程序中,我正在尝试调整此布局,以便在用户在android系统设置 - >显示 - >字体大小(或某些设备的辅助功能设置)中缩放系统范围的字体大小时可读。做一些挖掘我发现这会调整设备配置字体比例(getResources().getConfiguration.fontScale
)从1.0
到1.15
。
我在LinearLayout
得到一些奇怪的行为,其中一个TextView
s宽度被压碎,当它设置为wrap_content
,并且也没有反映一组minWidth
。
这是有问题的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="@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="@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="@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>
为什么包含2个LinearLayout
s的最后一个TextView
没有正确包装内容?我尝试删除导致任何问题的minWidth
incase并获得相同的结果。我不明白为什么所有其他布局都正确地包装它们的内容,但最后一个没有。
是否可以为缩放的系统范围字体添加资源文件夹?
编辑它似乎删除边距允许TextView
包装适当的宽度,但显然我需要边距。
谁能解释这种奇怪的行为?
编辑解决事实证明我完全忘记了“绘制项目”标签和时间图标之间布局中的不可见元素。这导致我的水平空间不足。
您似乎已使用layout_width="match_parent"
和gravity="end"
来对齐您的元素。
我假设在小型设备(或大文本)上,当没有足够的空间时,你想要“0 Paint Items”进行椭圆化,并且要在全宽度显示“时间”和“总计”字段。
为此,我们进行了以下更改:
首先,让sectionPaintItemToggle
有0dp
宽度和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="@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="@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="@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”视图是你想缩小的视图。
以上是关于当系统范围的字体缩放时,Android TextView不会包装内容的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms 选中时禁用 Shell TabBar 字体缩放