Android自动调整大小的TextView在减小字体大小之前会拆分单词。

16

有没有办法避免这个问题?

如果我的文本是 "Blablabla",但它无法适应一个方框,我不想得到像这样的东西:

Blabla- bla

我想要 "Blablabla" 的字体尺寸更小一些。是否有一种方法来控制自动调整大小的 TextView 是否会拆分单词?

以下是该问题的示例:

enter image description here

那里的最小文字大小是 1sp,所以很明显这个单词可以通过减小字体大小来适应。

似乎已经有人报告了这个问题:https://issuetracker.google.com/issues/38468964


也许你可以通过编程获取TextView的行数。如果行数大于1,只需减小文本大小并再次控制即可。 - Cagri Yalcin
Android Studio已经在不使用“-”的情况下将单词拆分,当文本填满行时。我认为我在你的问题中漏掉了一些重要的要点。 - Cagri Yalcin
1
哦,看来我错了。谢谢你告诉我不知道的信息。 - Cagri Yalcin
我也有同样的问题,@ThiagoPorciúncula,你找到解决方法了吗? - AmeyaB
@AmeyaB 不好意思:( 我们能做的最好只是关注那个问题,扩散信息,然后祈求最好的结果。我不认为我们自己有任何方法来解决这个问题。 - Fred Porciúncula
显示剩余5条评论
5个回答

5
我过去已经报告过这个问题(在这里在这里,其中一个你已经发现了),但似乎有一个解决方案,或者至少对我来说是有效的。
我认为这个提示可能会有所帮助:

enter image description here

这意味着您可以为textView选择断点策略。例如:
<TextView
   android:layout_width="250dp" 
   android:layout_height="wrap_content" 
   android:background="#f00"
   android:breakStrategy="balanced" 
   android:hyphenationFrequency="none"
   android:text="This is an example text" 
   android:textSize="30dp" 
   app:autoSizeTextType="uniform"/>

不幸的是,这并不总是像它应该的那样顺利运行。我注意到在希伯来语中,有时无法很好地传播:

https://issuetracker.google.com/issues/79936443

但至少它不会无缘无故地插入单词。使用这种解决方案的主要缺点是,它仅在API 23及以上版本中可用(根据Android仪表板统计数据,至少有62%的设备)。有人要求将其放入支持库(此处),但被告知这是不可能的。

2
那么你的意思是说我们可以通过简单地添加 android:breakStrategy="balanced"android:hyphenationFrequency="none" 来解决这个问题(至少对于英语来说)?但这似乎对我不起作用。 - Fred Porciúncula
@FredPorciúncula 我已在支持的设备上进行了测试,它可以正常工作。你在哪里进行了测试?你能否分享一个示例项目来展示你遇到的问题? - android developer
1
当然!我已经在 Nexus 5X 模拟器和 Pixel 3 设备上测试过,两者都运行 API 28。我可以重现我的原始问题中的代码问题。这是要点:https://gist.github.com/tfcporciuncula/cc3e7479e664c9c3d77d88d79d3da8ff如果您查看预览,您可以立即看到问题所在。就像每当有垂直空间时,Android 就会决定分割单词并无论如何断开行(而不是简单地减小字体大小)。如果您继续增加字符串,字体将在某个时候减小,但仅当没有更多垂直空间可用时。 - Fred Porciúncula
@FredPorciúncula 奇怪。我确定现在它可以正常工作。你可以尝试我的旧解决方案,链接在这里:https://github.com/AndroidDeveloperLB/AutoFitTextView 。也许我甚至已经报告了你提到的问题:https://issuetracker.google.com/issues/68787108 。 - android developer

3
我也遇到了同样的问题,并找到了一个“危险”的解决方法。对于我需要放在textView中的文本只有一两个单词,这种方法有效...无论如何,希望它能帮到你或者至少给你一些启示。 这是我所做的:
在XML中,我向AppCompatTextView添加了android:maxLines="2"。
在代码中,我检查文本是否只有一个单词,如果是,则通过编程方式设置textView.setMaxLines(1)。
我知道这不是完美的、通用的解决方案,但对我来说已经足够好了。 无论如何...如果你只需要使用android:maxLines="1"来适当地缩放“Blablabla”,那么就可以解决问题了。

很有趣!对于简单的情况,可以像你所做的那样通过调整 maxLines 来解决这个问题。 - Fred Porciúncula

1

1
我希望这能让某人有更好的理解。
基本上,我们强制 AutoSizing 功能使用单行来测量文本,这样它就会被迫使用最小的文本大小。
然后,在测量完成后,如果需要,我们允许它使用更多行。
public static void setTextForAutoSizingUsingMinimumLines(final TextView textView, final String text) {
textView.setMaxLines(1);
textView.setText(text);

textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Layout layout = textView.getLayout();
        if (layout == null) {
            return;
        }

        textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        if (layout.getLineCount() > textView.getMaxLines()) {
            //Let TextView use as much lines Layout needs to display text.
            textView.setMaxLines(layout.getLineCount());
            textView.invalidate();
        }
    }
});

}


0

我在一个按钮上遇到了类似的问题,Android自动调整文本大小将字符串“Reading lists”分成两行显示为“Readin”和“g lists”。

我找到的唯一成功的解决方法是用换行符(“\n”)替换单词之间的空格。因此,字符串资源变成了:

<string name="textButtonReadingLists">Reading\nlists</string>

虽然不是最理想的,但安卓将“Reading”放在一行上,下面是“lists”。希望这能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接