解决办法:
使用replaceAll("\\s", " ")过滤掉各种空白符即可实现目的。
原因:
\\s表示 空格,回车,换行等空白符,但是TextView的默认自动换行属性breakStrategy只能识别空格,
导致出现了异常的换行情况,将字符串中出现的各种空白符都用" "代替,就可以变成属性breakStrategy能够识别的空格了,也就可以达到我们想要的自动换行的效果了。
补充技术:
属性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 的默认折行策略就是这种。
最后给一个自定义的TextView
public class TextViewNoFoldView extends androidx.appcompat.widget.AppCompatTextView {
public TextViewNoFoldView(@NonNull Context context) {
super(context);
}
public TextViewNoFoldView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public TextViewNoFoldView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setText(CharSequence text, BufferType type) {
if (!TextUtils.isEmpty(text)) {
text = text.toString().replaceAll("\\s", " ");
}
super.setText(text, type);
}
}



















