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

时间:2017-12-31 05:17:13

标签: android android-layout android-linearlayout textview

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

我在LinearLayout中得到了一些奇怪的行为,其中TextView的宽度之一被压缩,当它被设置为wrap_content时,并且也没有反映出一组{ {1}}。

通常看起来像什么 normal 缩放字体时的样子 scaled

以下是有问题的minWidth(为截图中的上下文添加了评论)

LinearLayout

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

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

编辑似乎删除边距允许minWidth包装正确的宽度,但显然我需要边距。 no margins

任何人都可以解释这种奇怪的行为吗?

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

1 个答案:

答案 0 :(得分:1)

您似乎已使用layout_width="match_parent"gravity="end"来对齐元素。

假设在小型设备(或大文本)上,当没有足够的空间时,你想要“0 Paint Items”进行椭圆化,并将'Time'和'Total'字段设置为全宽展示。

为此,我们进行了以下更改:

首先,让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”视图是你想缩小的视图。