Android和  在TextView中


108

是否可以 在TextView中添加?有没有人实现过类似的功能?

我想在TextView中拥有不易碎的空间。

Answers:


184

TextView尊重Unicode不间断空格字符\u00A0),这是比HTML更简单/更轻松的解决方案。


3
很好。您可以将其添加到xml或Java代码中。在Java代码中工作正常,在xml中,我还没有做过很多测试,但是应该可以完成工作。
Mikooos 2011年

\ u0020和\ u00A0都不起作用。既不通过XML设置它们(甚至不使用XML预览),也不通过Java使用setText()设置它们。尝试同时使用Android 4.1和4.2
Stephan Wiesner 2013年

1
不能与逗号一起使用。在这种情况下,您会在逗号后得到换行符
Alex Bonel

1
\ u00A0对我没有帮助。它没有空格,只是加上了单词-Android 4.4.4、5.0、5.1
Marcel Bro 2015年

1
在Kotlin,效果很好。我用这个替换所有空白,它将从最后一个字符开始省略。str.replace(“”,“ \ u00A0”)产生,“ Hello wor ...”而不是“ Hello ...”
Seop Yoon


24

可以使用 具有可读性的解决方案。除非您记得十六进制代码,否则在文本中包含\u00A0or   /  并不会真正向源代码的读者(或与此有关的翻译)传达太多信息。这是在中使用命名实体的方法strings.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY nbsp "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

这将创建缺少的声明。原始的HTML声明可在https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent中找到,这些XHTML DTD引用了这些内容。所有这些工作正常,因为XML解析器在加载文件时会读取这些内容并进行替换,因此实体不会出现在生成的编译资源中。

&nbsp;Android Text(CharSequence)中的资源

<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this&nbsp;name</b></string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    android:text="@string/html_text"
    />

设备和预览(预览无法识别HTML)
设备上的HTML 预览中的HTML

&nbsp; Android String(格式化)资源中的内容

<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is&nbsp;nice</string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    tools:text="@string/formatted_text"
    />

然后在代码中:

String contents = getString(R.string.formatted_text, "Using an &nbsp;");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);

设备和预览(预览无法识别实体,Java字符串是文字文本!)
在设备上格式化 预览格式

进一步的技巧

这些只是DTD实体的示例用法,请根据自己的喜好使用它。

<!ENTITY con "\&apos;"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
                            Sadly &apos; cannot be overridden due to XML spec:
                            https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "&#37;1$s"><!-- format string argument #1 -->

<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap &param1;</string>

它们都有助于突出显示: 突出显示的XML实体


Android 可以很好地处理角色,无需创建撇号实体。<string name="original">Don’t wrap %1$s</string>如预期般运作。
Diti

1
@Diti这不是一个单引号,这是一个右单引号 ; 比较'VS 。Android的花哨的Unicode字符没有问题,但ASCII 0x27则存在问题,需要转义。实体只是一种便利,我只是将其放在此处以演示它可能有用的地方。
TWiStErRob '16

这太好了=)谢谢。我发现它更加简洁易读。
亚历克斯·哈特

好答案,谢谢!我同意有&nbsp;在琴弦的方式更有意义的翻译比unicode的\u00A0
马克·Attinasi

1
@七个,当然,请参阅最后一节(更多技巧),该节在同一文件中添加conparam1
TWiStErRob

18

TextView应该尊重不间断的空间

<string name="test">Hello&#160;world</string>

要么

new TextView("Hello\u00A0world");

3

我遇到的一种独特情况是在使用String.format参数的字符串资源中添加不间断空格。

<resources>
    <string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>

我试图简单地将不间断空格字符复制并粘贴到字符串中,并在编译后将其替换为常规的旧空格。

删除formatted =“ false”,为格式args编号并使用反斜杠符号对我有用:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>

2

这对我有用:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    textview.setText(Html.fromHtml(your string, Html.FROM_HTML_MODE_LEGACY));
} else {
    textview.setText(Html.fromHtml(your string);
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.