Android 和 TextView
Posted
技术标签:
【中文标题】Android 和 TextView【英文标题】:Android and in TextView 【发布时间】:2011-09-27 17:34:17 【问题描述】:是否可以在 TextView 中添加 
?有没有人实现过类似的功能?
我想在 TextView 中有不可破坏的空间。
【问题讨论】:
【参考方案1】:TextView
尊重 Unicode no-break space character (\u00A0
),这将是比 html 更简单/更轻巧的解决方案。
【讨论】:
效果很好。您可以将其添加到 xml 或 java 代码中。在java代码中工作正常,在xml中我没有测试太多,但它应该可以完成这项工作。 \u0020 和 \u00A0 都不起作用。既不是通过在 XML 中设置它们(甚至不是在 XML 中的预览中),也不是通过使用 setText() 在 Java 中设置它们。用 android 4.1 和 4.2 都试过 这不能与逗号一起使用。在这种情况下,您会在逗号后换行 \u00A0 对我不起作用。它不做空格,只是加入单词 - Android 4.4.4, 5.0, 5.1 在 Kotlin 中,它运行得非常好。我用这个替换所有的空格,它会从最后一个字符变成椭圆。 str.replace(" ", "\u00A0") 产生 "Hello wor..." 而不是 "Hello..."【参考方案2】:可以使用 
来获得可读的解决方案。 在文本中包含\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_
android:layout_
android:background="#10000000"
android:text="@string/html_text"
/>
设备和预览(预览无法识别 HTML)
&nbsp;
在 Android 字符串(格式化)资源中
<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is nice</string>
<!-- Used in a layout -->
<TextView
android:layout_
android:layout_
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);
设备和预览(预览无法识别实体,Java 字符串是文字!)
更多技巧
这些只是 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>
它们都有助于突出显示:
【讨论】:
Android 可以很好地处理’
字符,无需创建撇号实体。 <string name="original">Don’t wrap %1$s</string>
按预期工作。
@Diti 那不是APOSTROPHE,那是RIGHT SINGLE QUOTATION MARK;比较'
与’
。 Android 对更花哨的 Unicode 字符没有问题,但对 ASCII 0x27 有问题,需要转义。实体只是为了方便,我只是把它放在那里展示它可能有用的地方。
这太棒了 =) 谢谢。我发现这更清晰,更容易阅读。
很好的答案,谢谢!我同意在字符串中包含 &nbsp;
对翻译人员来说比 unicode \u00A0
更有意义
@Seven 当然,参见最后一节(更多技巧),它在同一文件中添加了con
和param1
。【参考方案3】:
\u00A0
是不间断空格,\u0020
不是不间断空格
【讨论】:
【参考方案4】:TextView 应该尊重非中断空间
<string name="test">Hello world</string>
或
new TextView("Hello\u00A0world");
【讨论】:
【参考方案5】:我遇到的一个独特情况是向采用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>
【讨论】:
【参考方案6】:这对我有用:
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);
【讨论】:
它只会使字符串看起来像 HTML 文本。您应该在your string
中设置必填文本。【参考方案7】:
这是一个在 TextView 中使用 nbsp 的示例
<string name="text">Example:\u00A0</string>
【讨论】:
应该是\u00A0【参考方案8】:奇怪,但在我的情况下,这两个都不起作用:
&nbsp;
\u00A0
TextView
将它们显示为文本。
所以我只是按原样插入不间断空格:“ ”
【讨论】:
以上是关于Android 和 TextView的主要内容,如果未能解决你的问题,请参考以下文章
FrameLayout 中的 'android:foreground' 和 'android:foregroundGravity' 如何影响其外观?
android:windowBackground 和 android:colorBackground 之间的区别?
如何建立与 Android studio和 gradle android 库
Android Webview 和Javascript交互,实现Android和JavaScript相互调用