Android 改变换行行为

Android 改变换行行为,android,textview,word-wrap,Android,Textview,Word Wrap,我可以在文本视图中使用Spanable创建具有不同外观、下划线、删除线等的跨距。如何更改换行行为?特别是,我不想让一个电子邮件地址在中间包装,我希望它像一个字。 我试过了,但没能成功。看起来它只被DynamicLayout使用,我不能强迫TextView使用DynamicLayout <TextView android:id="@+id/merchant_email_field" android:layout_width="fill_parent" android:layout

我可以在文本视图中使用Spanable创建具有不同外观、下划线、删除线等的跨距。如何更改换行行为?特别是,我不想让一个电子邮件地址在中间包装,我希望它像一个字。

我试过了,但没能成功。看起来它只被DynamicLayout使用,我不能强迫TextView使用DynamicLayout

<TextView
  android:id="@+id/merchant_email_field"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textSize="@dimen/account_setting_email"
  android:gravity="center"
  android:bufferType="spannable"
  android:maxLines="2"
  android:ellipsize="end"
  />

您是否尝试过将android:singleLine=“true”添加到您的XML中?

不知道您是否找到了答案,但您可以使用unicode来帮助您

有一个非中断空格字符,因此需要用该字符(\u00A0)替换所有不可中断的空格

例如

String text = "Hello World";
text.replace(' ', '\u00A0');
textView.setText(text);
顺便说一句,我寻找了一个span解决方案,但没有找到,WrapTogetherSpan只是一个接口,所以它不起作用


但是使用这种方法,我相信如果您愿意,您可以定制一个牢不可破的跨度。

如果您正在实施一个更低级的解决方案(即,自己绘制文本并处理换行),请参见。
BreakIterator.getLineInstance()
factory方法将电子邮件地址视为单个单元

String text = "My email is me@example.com.";
BreakIterator boundary = BreakIterator.getLineInstance();
boundary.setText(text);
int start = boundary.first();
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) {
    System.out.println(start + " " + text.substring(start, end));
    start = end;
}
输出显示可以接受换行的边界起始索引

0 My 
3 email 
9 is 
12 me@example.com.
另请参见


没有,因为我最多需要两行。我只想把电子邮件地址用一个词包装起来。对不起,我以前不明白。现在有了更多的道理,你为什么要用一个小男孩来做这件事。:)嗯,这适用于空间。但是在问题中提到的电子邮件地址的情况下,它没有帮助。我可能可以把U+FEFF或U+2060这样的不可见字符粘在里面,但这很烦人,因为它必须在每个字符之间。
0 My 
3 email 
9 is 
12 me@example.com.