为啥 TextView 在单行省略了“结束”显示框?

Posted

技术标签:

【中文标题】为啥 TextView 在单行省略了“结束”显示框?【英文标题】:Why does TextView in single line elipsized with "end" show boxes?为什么 TextView 在单行省略了“结束”显示框? 【发布时间】:2011-09-23 10:33:05 【问题描述】:

我在 android 中使用 TextView,我想在 TextView 中显示以“.”结尾的 1 行,但这会在末尾给出 [] 类型框。我不知道为什么?我只想删除这个框,只显示以“...”结尾的文本

更新 list_row.xml 的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="horizontal"
android:gravity="center_vertical"
android:cacheColorHint="#4C7B8D"
android:background="#4C7B8D">
<ImageView
    android:id="@+id/videoListImage"
    android:src="@drawable/audio_thumbnail60x60"
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_centerInParent="true"
    android:scaleType="fitXY"
    android:layout_
    android:padding="4dp"
    android:background="@color/light_gray" />
<RelativeLayout
    android:layout_
    android:layout_>
    <LinearLayout
        android:layout_
        android:layout_
        android:layout_marginRight="5dp"
        android:layout_toLeftOf="@+id/next_arrow"
        android:orientation="vertical"
        android:gravity="center_vertical"
        android:paddingLeft = "5dp">
        <TextView
            android:id="@+id/row_title"
            android:layout_
            android:layout_
            android:singleLine="true"
            android:textColor="@color/app_background_color"
            android:textSize="18sp"
            android:ellipsize="end"             
            android:maxLines="1" />
        <TextView
            android:id="@+id/row_dis"
            android:layout_
            android:layout_
            android:singleLine="true"
            android:textColor="@color/color_black"
            android:layout_marginRight="2dp"
            android:textSize="15sp"
            android:ellipsize="end"
            android:maxLines="1" />
        <TextView
            android:text="$7.50"
            android:id="@+id/audio_price_btn"
            android:layout_
            android:layout_
            android:textSize="16dp"
            android:textColor="@color/color_white"
            android:textStyle = "bold"
            android:paddingLeft = "12dp"
            android:paddingRight = "12dp"
            android:background="@drawable/blue_round_cornor_background" />
    </LinearLayout>
    <ImageView
        android:id="@+id/next_arrow"
        android:src="@drawable/next_arrow"
        android:layout_toLeftOf="@+id/saved_purchased"
        android:scaleType="fitXY"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:visibility = "gone"/>
    <ImageView
        android:id="@+id/saved_purchased"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop ="true"
        android:scaleType="fitXY"
        android:layout_
        android:layout_
        android:layout_marginRight="2dp"/>
</RelativeLayout>

这是“next_arrow”的图片

这是我在适配器中使用 getView() 的代码。

  String discription = listData.getDescription();
    if (discription != null && discription.length() > 0) 
        if (textViewDis != null) 
            textViewDis.setTypeface(titleFont);
            Log.e("data", ""+discription);
            discription.replaceAll("\r\n", "");
            textViewDis.setText(discription);
        
    

这是要显示的实际描述字符串。

Andrew 和 Stephanie Tidwell 坦率地分享了他们在这项业务中的成功故事。这个故事将帮助每个倾听的人意识到没有人是完美的,即使在第二代企业中也是如此。这是一个流式音频文件。

还有问题吗?我可以更新更多问题。

【问题讨论】:

我认为您的布局没有任何问题。 TextView 的价值从何而来?是否有可能以某种方式在字符串上附加回车/换行符号? 哦,是的,这可能是个问题……我不想考虑。如何解决? 尝试将String.replaceAll("\r\n", "") 应用于您的字符串。 【参考方案1】:

从one of my books引用我自己的话:

Android 的 TextView 类具有“椭圆化”文本的内置功能, 如果文本长于可用文本,则截断它并添加省略号 空间。例如,您可以通过 android:ellipsize 属性使用它。 这工作得相当好,至少对于单行文本。 Android 使用的省略号不是三个句点。相反,它使用了一个实际的 省略号字符,其中三个点包含在一个字形中。 因此,您使用的任何字体也使用“省略号”功能将 需要省略号字形。

除此之外,Android 会填充在屏幕上呈现的字符串,这样长度(以字符为单位)在之前和之后是相同的 “省略”。为了实现这一点,Android 将一个字符替换为 省略号,并用 Unicode 替换所有其他已删除的字符 字符“零宽度无间断空间”(U+FEFF)。这意味着 省略号后的“额外”字符不占用任何可见空间 屏幕,但它们可以是字符串的一部分。

但是,这意味着您用于 TextView 小部件的任何自定义字体 你使用 android:ellipsize 还必须支持这个特殊的 Unicode 特点。并非所有字体都可以,您会在屏幕上看到伪影 如果您的字体缺少此字符,则表示您的缩短字符串 (例如,流氓 X 出现在行尾)。

【讨论】:

非常感谢先生抽出宝贵时间。我得到了它。但是如何解决这个问题呢?你解决了吗? @Arslan:使用内置字体。或者,修复字体以包含丢失的 U+FEFF 字形。或者,使用已有此字形的字体。 @Manu-iAndyDev :是的,我更改了字体。您也可以使用内置字体。【参考方案2】:

我在尝试使用自定义“MetaPro-Medium.otf”作为TextView 的字体时遇到了同样的问题 android:singleLine="true"。 字符串末尾的框真的很烦人。

我没有发现如何在 Android 中解决这个问题,但同时找到了以下解决方法。

    我已经安装了“FontLab Studio v5.04” 打开我的字体 选择了我不打算使用的符号之一 菜单->字形->重命名字形 将名称和 unicode 索引从原来的值更改为“FEFF”(感谢 CommonsWare) 双击所选符号,然后删除创建此符号的所有行。 菜单->文件->生成字体->另存为otf类型

结果我得到了更新的字体并且问题消失了。

【讨论】:

【参考方案3】:

Arslan,你的布局在我的情况下工作正常,我已经测试过:

 <TextView
    android:id="@+id/row_title"
    android:layout_
    android:layout_
    android:singleLine="true"
    android:textSize="18sp"
    android:ellipsize="end"             
    android:maxLines="1"
    android:text="This is the demo testing demo testing This is the demo testing demo testing"/>

... 并获得您想要的确切输出“一行以...结尾”并且应该删除框。所以我认为您设置的任何字符或文本都可能有问题。

【讨论】:

感谢您的宝贵时间。让我再检查一遍。我这个“>”图像可能会导致问题。【参考方案4】:

当我尝试显示来自 webservice url 的内容时,我遇到了一些特殊符号的相同问题(显示框([])),即使我不使用 android:ellipsize。然后我替换代码来自

textview.settext(content);

textview.settext(html.fromHtml(content));

工作正常。

【讨论】:

不知道为什么这对我不起作用。有没有什么特别的时间你设置textview是在onCreate中吗?【参考方案5】:

实际上我遇到了这个问题,我没有更改字体或使用 setText,而是将 scrollHorizo​​ntally 添加为 false 并修复了额外的框字符

android:singleLine="true"
android:scrollHorizontally="false"
android:ellipsize="end"

【讨论】:

我重新编译后,似乎这个解决方案不起作用。起作用的是不使用椭圆形。到目前为止,我发现完成这项工作的唯一方法是编辑字体。我没有 Fontlab Studio,也买不起 900 美元。所以我暂时将其删除,稍后制作我自己的 ellipsize 版本。【参考方案6】:

在我的项目中遇到了类似的问题,我在文本视图中使用了字体类型。很少有字体类型有这些使 ... 最后显示为 [] 的问题。如果您尝试更改字体,问题将得到解决。

【讨论】:

以上是关于为啥 TextView 在单行省略了“结束”显示框?的主要内容,如果未能解决你的问题,请参考以下文章

android textview 设置单行最大宽度和ellipsize省略号时整体变短的问题

Android利用TextView制作跑马灯该效果

为啥超出单行 TextView 边界的单词不会被渲染和剪切?

TextView的跑马灯效果(AS开发实战第二章学习笔记)

css实现单行多行文本溢出显示省略号(…)

文字单行超出时隐藏不换行并且省略号提示/字母文字缩进间隔属性