目前采取的正确的换行方式:
添加箭头指向的那句话即可,原因是\\s表示 空格,回车,换行等空白符,但是TextView的默认自动换行属性breakStrategy只能识别空格,
导致出现了异常的换行情况,将字符串中出现的各种空白符都用" "代替,就可以变成属性breakStrategy能够识别的空格了,也就可以达到我们想要的自动换行的效果了。
以上方案会有一个问题,就是用户发送消息主动换行不起作用,暂时的解决方案是先将换行符用特殊字符串替换掉,之后再进行\\s的替换,最后再把特殊字符串更换为换行符,如下:
属性breakStrategy:
1.自 Andriod API 23(Android 6.0)起,TextView 新增了一个 breakStrategy 属性,这个属性用于控制将一段文本分割成多行时的折行策略,通俗的讲就是决定一行到底需要显示多少文本。
breakStrategy 既可以通过 TextView 的 xml 属性 android:breakStrategy设置,也可以通过 setBreakStrategy 方法来设置。可以设置的值只有三个,它们是 android.text.Layout 类的三个常量:
- BREAK_STRATEGY_SIMPLE:对应 xml 属性 "simple"
- BREAK_STRATEGY_HIGH_QUALITY:对应 xml 属性 "high_quality"
- BREAK_STRATEGY_BALANCED :对应 xml 属性 "balanced"
2. 三种折行策略对比
2.1 BREAK_STRATEGY_SIMPLE
简单折行。这种策略会在每一行显示尽可能多的字符,直到这一行不能显示更多字符时才进行换行,同时这种策略下不会自动添加连词符(官方文档说,当一行只有一个单词并且宽度显示不下的情况下才会添加连词符,不过在测试过程中并没有看到连词符)。
在进行文本编辑时,后添加的文本不会影响前面文本的布局显示,比较适合可编辑的文本。EditText 默认的折行策略就是这种,因为可以避免在输入文本时由于布局刷新导致的字符跳动问题,保证用户的输入体验。
2.2 BREAK_STRATEGY_BALANCED
平衡折行。这个策略会尽可能保证一个段落的每一行的宽度相同,必要时会添加连词符。
2.3 BREAK_STRATEGY_HIGH_QUALITY
高质量折行。这个策略会针对整段文本的折行进行布局优化,必要时会自动添加连词符。和其他两种策略相比,这个策略会略微影响性能,并且需要更多时间进行文本布局。这个策略通常比较适合只读文本,TextView 的默认折行策略就是这种。
4. 低版本表现
由于 breakStrategy 这个属性在 API 23 才被添加进来,因此有必要了解在低版本时文本折行策略。这样当我们使用这个属性时,可以做到心中有数,尽量避免兼容性导致的体验问题。
先说结论,根据我(并不严谨)的测试,在低版本时 TextView 采用的折行策略是 simple。
测试过程:我使用了同一款机型的模拟器,一个运行系统版本为 19,一个运行系统版本为24,在显示内容相同的情况下,对比发现,低版本布局与高版本设置simple时的布局一致(这段文本在折行策略为balanced和high_quality时均表现为不同布局)。