【问题标题】:Android and   in TextViewAndroid 和 TextView
【发布时间】:2011-09-27 17:34:17
【问题描述】:

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

我想在 TextView 中有不可破坏的空间。

【问题讨论】:

    标签: android 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_width="130dp"
        android:layout_height="wrap_content"
        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_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>
    

    它们都有助于突出显示:

    【讨论】:

    • 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 将它们显示为文本。

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

          【讨论】:

            猜你喜欢
            • 2014-04-26
            • 1970-01-01
            • 2014-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-14
            相关资源
            最近更新 更多