TextView中的文本统一换行

4

我需要TextView中的良好文本换行,特别是标题中的文本。

TextView的文本换行可能像这样,最后一个单词在新行中:

| ========================= |
|          =====            |

我希望您能够进行换行操作,使得每一行的宽度更加均衡:
|     ================      |
|      ==============       |

在一种语言上添加'\n'并在不同的屏幕尺寸上测试很容易,但当存在超过10种翻译时就不那么简单了。

6个回答

3

我修改了TextView并创建了UniformTextView。在研究了TextView的源代码后,我决定将它的宽度最小化以达到预期的行数。

    <pl.dziobas.uniformtextview.UniformTextView
        android:text="@string/sample_text"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:prefLineNumber="2"
        style="@style/sample_style" />

对我来说,它的表现令人满意。
UniformTextView example

源代码可在github上获取。


1
你可以在字符串资源xml中添加一个'\n'来添加换行符,这样你就可以自己管理换行。另一种方法是,在获取字符串长度除以2并搜索下一个空格的方向上动态添加'\n',在第一次找到时将其添加。虽然有点hack,但应该能够工作。除此之外,在Android中没有太多关于连字或排版的内容。可能这篇文章会给你一些提示:http://smarter-than-the-average-pierre.blogspot.co.at/2011/10/bad-android-typography-tale-of-text.html

问题在于不同的翻译和不同的屏幕尺寸。 - pawelzieba
我知道,谢谢 :). 它适用于小规模,不适用于将50个文本翻译成20种语言。我不知道在所有语言中该在哪里拆分行 :) - pawelzieba
看一下我的修改并尝试我的技巧,如果你有多个单词的标题,它可能会起作用。 - Patrick
我制作了一个黑客软件,但是不同于其他的。感谢提供文章链接。 - pawelzieba

1

Github 中有一个开源项目 AutoFittextView,在 BitBucket 中也有 AutoScaletextView

您可以根据需要进行更改。

我尝试了 AutoScaleTextview 并得到了下面的输出

enter image description here

希望这能帮到您。

感谢您的启发。那些库可以调整文本大小,但我想保持文本大小不变。 - pawelzieba

1
算法大致如下:
  1. 计算字符串宽度(使用Paint.measureText或类似方法)
  2. 如果宽度小于容器(TextView)宽度,则直接使用该宽度
  3. 否则,将字符串宽度除以容器宽度,以确定输入多少个"\n"
  4. 使用某种搜索算法查找距离宽度的1 / n最近的空格字符(如果字体不是等宽字体,则再次使用measureText
  5. 在该点处进行子字符串并重复步骤4以获得n-1(n> 1)
可能需要一些调整,例如使用比实际大小小的一些小百分比来使用容器宽度。

谢谢你的回答。我调整了TextView的大小而不是换行。我不知道哪个解决方案更好。问候 :) - pawelzieba
@pawelzieba 对你有效,所以更好。我猜它在某些布局中不起作用,这些布局强制子元素的宽度。LinearLayout很自由。 - MaciejGórski

0

如果您事先知道文本是什么(也就是说,如果它是硬编码的文本),则可以以dp为单位固定TextView的宽度,使其正确地折行;否则,您也可以使用android:ems来限制每行中的最大字符数。因此,您的TextView可以如下所示:

<TextView
   android:layout_height="wrap_content"
   android:layout_width="100dp"
   android:lines="2"/>

或者

  <TextView
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:ems="15"
     android:lines="2" />

希望这能有所帮助!


抱歉,这不是正确的方法。感谢您的尝试帮助。 - pawelzieba

0

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