解决办法

使用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 默认的折行策略就是这种,因为可以避免在输入文本时由于布局刷新导致的字符跳动问题,保证用户的输入体验。

android textview 文字自动换行 textview自动换行属性_空白符

 

2.2 BREAK_STRATEGY_BALANCED

 

平衡折行。这个策略会尽可能保证一个段落的每一行的宽度相同,必要时会添加连词符。

android textview 文字自动换行 textview自动换行属性_android_02

2.3 BREAK_STRATEGY_HIGH_QUALITY

高质量折行。这个策略会针对整段文本的折行进行布局优化,必要时会自动添加连词符。和其他两种策略相比,这个策略会略微影响性能,并且需要更多时间进行文本布局。这个策略通常比较适合只读文本,TextView 的默认折行策略就是这种。

 

android textview 文字自动换行 textview自动换行属性_xml_03

最后给一个自定义的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);
}
}