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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当系统范围的字体缩放时,Android TextView不会包装内容相关的知识,希望对你有一定的参考价值。

在我的应用程序中,我正在尝试调整此布局,以便在用户在android系统设置 - >显示 - >字体大小(或某些设备的辅助功能设置)中缩放系统范围的字体大小时可读。做一些挖掘我发现这会调整设备配置字体比例(getResources().getConfiguration.fontScale)从1.01.15

我在LinearLayout得到一些奇怪的行为,其中一个TextViews宽度被压碎,当它设置为wrap_content,并且也没有反映一组minWidth

通常看起来像normal当字体缩放时,它看起来像scaled

这是有问题的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个LinearLayouts的最后一个TextView没有正确包装内容?我尝试删除导致任何问题的minWidth incase并获得相同的结果。我不明白为什么所有其他布局都正确地包装它们的内容,但最后一个没有。

是否可以为缩放的系统范围字体添加资源文件夹?

编辑它似乎删除边距允许TextView包装适当的宽度,但显然我需要边距。 no margins

谁能解释这种奇怪的行为?

编辑解决事实证明我完全忘记了“绘制项目”标签和时间图标之间布局中的不可见元素。这导致我的水平空间不足。

答案

您似乎已使用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="@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 字体缩放

Fabric js:使用鼠标调整大小时增加字体大小而不是仅仅缩放

如何在android中为警报对话框设置自定义字体?

TextInput 允许字体缩放 false

复杂视图中的 SwiftUI 字体缩放

Android App修改字体大小,且不随系统字体大小更改