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 "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

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

&amp;nbsp; 在 Android 文本 (CharSequence) 资源中

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

<!-- Used in a layout -->
<TextView
    android:layout_
    android:layout_
    android:background="#10000000"
    android:text="@string/html_text"
    />

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

&amp;nbsp; 在 Android 字符串(格式化)资源中

<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is&nbsp;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 &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>

它们都有助于突出显示:

【讨论】:

Android 可以很好地处理 字符,无需创建撇号实体。 &lt;string name="original"&gt;Don’t wrap %1$s&lt;/string&gt; 按预期工作。 @Diti 那不是APOSTROPHE,那是RIGHT SINGLE QUOTATION MARK;比较'。 Android 对更花哨的 Unicode 字符没有问题,但对 ASCII 0x27 有问题,需要转义。实体只是为了方便,我只是把它放在那里展示它可能有用的地方。 这太棒了 =) 谢谢。我发现这更清晰,更容易阅读。 很好的答案,谢谢!我同意在字符串中包含 &amp;nbsp; 对翻译人员来说比 unicode \u00A0 更有意义 @Seven 当然,参见最后一节(更多技巧),它在同一文件中添加了conparam1【参考方案3】:

\u00A0 是不间断空格,\u0020 不是不间断空格

【讨论】:

【参考方案4】:

TextView 应该尊重非中断空间

<string name="test">Hello&#160;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 的示例

&lt;string name="text"&gt;Example:\u00A0&lt;/string&gt;

【讨论】:

应该是\u00A0【参考方案8】:

奇怪,但在我的情况下,这两个都不起作用:

&amp;nbsp; \u00A0 TextView 将它们显示为文本。

所以我只是按原样插入不间断空格:“ ”

【讨论】:

以上是关于Android 和 TextView的主要内容,如果未能解决你的问题,请参考以下文章

FrameLayout 中的 'android:foreground' 和 'android:foregroundGravity' 如何影响其外观?

android:windowBackground 和 android:colorBackground 之间的区别?

如何建立与 Android studio和 gradle android 库

Android Webview 和Javascript交互,实现Android和JavaScript相互调用

android: android中dipdppxsp和屏幕密度

android组件化和插件化的区别