【发布时间】:2011-09-27 17:34:17
【问题描述】:
是否可以在 TextView 中添加 ?有没有人实现过类似的功能?
我想在 TextView 中有不可破坏的空间。
【问题讨论】:
是否可以在 TextView 中添加 ?有没有人实现过类似的功能?
我想在 TextView 中有不可破坏的空间。
【问题讨论】:
TextView 尊重 Unicode no-break space character (\u00A0),这将是比 HTML 更简单/更轻巧的解决方案。
【讨论】:
可以使用  来获得可读的解决方案。 在文本中包含\u00A0 或  或 /  并不能真正传达太多信息给源代码的读者(或翻译者),除非你记得十六进制代码。这是strings.xml中使用命名实体的一种方法:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
这将创建缺少的声明。原始 HTML 声明可以在 https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent 中找到,引用自通常的 XHTML DTDs。所有这些都有效,因为 XML 解析器会在加载文件时读取这些内容并进行替换,因此实体不会出现在生成的编译资源中。
&nbsp; 在 Android 文本 (CharSequence) 资源中<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this 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"
/>
&nbsp; 在 Android 字符串(格式化)资源中<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is 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 ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
这些只是 DTD 实体的示例用法,请根据自己的喜好使用它。
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
【讨论】:
’ 字符,无需创建撇号实体。 <string name="original">Don’t wrap %1$s</string> 按预期工作。
' 与’。 Android 对更花哨的 Unicode 字符没有问题,但对 ASCII 0x27 有问题,需要转义。实体只是为了方便,我只是把它放在那里展示它可能有用的地方。
&nbsp; 对翻译人员来说比 unicode \u00A0 更有意义
con 和param1。
\u00A0 是不间断空格,\u0020 不是不间断空格
【讨论】:
TextView 应该尊重非中断空间
<string name="test">Hello world</string>
或
new TextView("Hello\u00A0world");
【讨论】:
我遇到的一个独特情况是向采用String.format 参数的字符串资源添加不间断空格。
<resources>
<string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>
我尝试简单地将不间断空格字符复制并粘贴到字符串中,并在编译后将其替换为常规的旧空格。
删除 formatted="false",为格式参数编号并使用反斜杠符号对我有用:
<resources>
<string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
【讨论】:
这对我有用:
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);
}
【讨论】:
your string 中设置必填文本。
这是一个在 TextView 中使用 nbsp 的示例
<string name="text">Example:\u00A0</string>
【讨论】:
奇怪,但在我的情况下,这两个都不起作用:
&nbsp;\u00A0
TextView 将它们显示为文本。所以我只是按原样插入不间断空格:“ ”
【讨论】: