为啥 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,而是将 scrollHorizontally 添加为 false 并修复了额外的框字符
android:singleLine="true"
android:scrollHorizontally="false"
android:ellipsize="end"
【讨论】:
我重新编译后,似乎这个解决方案不起作用。起作用的是不使用椭圆形。到目前为止,我发现完成这项工作的唯一方法是编辑字体。我没有 Fontlab Studio,也买不起 900 美元。所以我暂时将其删除,稍后制作我自己的 ellipsize 版本。【参考方案6】:在我的项目中遇到了类似的问题,我在文本视图中使用了字体类型。很少有字体类型有这些使 ... 最后显示为 [] 的问题。如果您尝试更改字体,问题将得到解决。
【讨论】:
以上是关于为啥 TextView 在单行省略了“结束”显示框?的主要内容,如果未能解决你的问题,请参考以下文章
android textview 设置单行最大宽度和ellipsize省略号时整体变短的问题