63
<TextView android:id="@+id/prodLbl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:textColor="#FFFFFF"
    android:textSize="30dip"
    android:textStyle="italic"
    android:text="Magnifico"
    />

似乎从最右边的字符中剪掉了几个像素,至少在 480x800 模拟器或 Nexus One 上。

对我来说它看起来像一个错误,但我只是一个 Android 初学者。我试图在左右两边添加边距,但它仍然在剪裁。最后,我的破解方法是在文本的两侧添加一个空格。还有其他解决方案吗?

4

14 回答 14

28

android:layout_width="wrap_content", 为您提供一个用于包装内容渲染的矩形。一切都适用于普通文本(非斜体)。

启用文本后,换行的italic文本将尝试适合矩形,因此最右边的字符将被截断,除非其不可截断(例如., ),1等)

建议的解决方案是在文本末尾留一个空格(或者更好的??)

PS:这也适用,android:gravity="right"因为文本将被推到最右边。如果我们有italic文本,我们将面临同样的问题。

于 2011-01-19T21:10:57.507 回答
26

您还可以使用Unicode 不间断空格字符(\u00A0)。

于 2012-03-03T07:08:52.913 回答
13

我添加" \"到我的 strings.xml 中所有字符串的末尾。\是转义字符,所以这样我可以解决这个问题,但这个解决方案很讨厌。希望这可以帮助。

于 2011-04-14T16:46:47.483 回答
7

只需在文本末尾添加一个额外的空格即可。在 XML 中,您必须添加\u0020到末尾,否则默认情况下 XML 会忽略开头/结尾处的空格。

于 2013-01-04T21:52:06.100 回答
6

找到了另一个解决方案(使用 4.1.2 和 4.3 测试wrap_content)。如果您扩展TextViewEditText分类,您可以通过这种方式覆盖onMeasure方法:

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    final int measuredWidth = getMeasuredWidth();
    final float tenPercentOfMeasuredWidth = measuredWidth * 0.1f;
    final int newWidth = measuredWidth + (int) tenPercentOfMeasuredWidth;

    setMeasuredDimension(newWidth, getMeasuredHeight());
}
于 2013-10-10T07:27:58.607 回答
5

您可以在字符串中添加 HAIR SPACE

<string name="hair_space">&#x200A;</string>

String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)
于 2016-06-02T08:08:43.313 回答
3

一个适当和干净的解决方案:

使用斜体自定义字体而不是设置 textStyle='italic' 例如:

<android.support.v7.widget.AppCompatTextView
            android:text="yolO"
            app:fontFamily="@font/roboto_italic"/>

我没有在常规 TextView 上尝试过,但根据我的观察,问题出在 textStyle='italic' 上。

无需任何破解即可工作!

这是责备 textStyle 属性的证明:

我制作了一个自定义 fontFamily 并为普通、粗体和斜体定义了字体

res/font/app_font_family.xml

<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font app:fontStyle="normal" app:fontWeight="400" app:font="@font/roboto_regular"/>
    <font app:fontStyle="italic" app:fontWeight="400" app:font="@font/roboto_italic" />
    <font app:fontStyle="normal" app:fontWeight="700" app:font="@font/roboto_medium"/>
</font-family>

现在,当我使用这个 fontFamily 并应用 textStyle='italic' 时,最右边的字符仍然被剪掉。

<android.support.v7.widget.AppCompatTextView
            android:text="yolO"
            app:fontFamily="@font/app_font_family"
            android:textStyle='italic' />

这是在 Api 23 上,支持库 28.0.0 和 Android Studio 3.2

于 2019-01-04T06:21:59.647 回答
2

查看源代码,我发现设置阴影会扩展剪辑矩形。

一个技巧是在角色之外设置一个不可见的阴影。

例如:

android:shadowRadius="2"
android:shadowDx="2"
android:shadowColor="#00000000"

我认为这个解决方案更好,因为它不会扩展TextView添加额外字符时可能发生的宽度(在背景中更明显)。

于 2013-07-17T16:26:56.097 回答
2

这也适用于固定宽度的 TextView,而不仅仅是“wrap_content”。我不确定这个问题是否像一些评论者所暗示的那样是特定于版本的。我在所有 Honeycomb 版本上都看到了这个问题。从我所看到的情况来看,通过设置边距、填充、使用固定宽度或真正的斜体自定义字体,问题并没有消失。

于 2012-02-15T23:50:13.360 回答
1

这是我的解决方案:格式化 textview 并测量。之后设置宽度为 1 像素的 textview 添加到测量的宽度。

TextView textView = new TextView(this);
textView.setText("Text blah blah");
textView.setTypeface(typeface, Typeface.BOLD_ITALIC)
textView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
textView.setLayoutParams(new LayoutParams(textView.getMeasuredWidth() + 1, 
                                             LayoutParams.WRAP_CONTENT));

为我工作。希望这些帮助。

于 2015-04-06T09:58:29.417 回答
0

虽然我通常更喜欢sziraqui建议使用真正的斜体字体的答案,但这些并不总是可用的。
由于手头的问题是由文本边界的错误测量引起的,我只是设置android:layout_width="0dp",为 TextView 提供所需的水平空间。这在所有情况下也可能不是理想的,但在许多情况下它是一个简单且不太老套的解决方案。

于 2020-12-27T13:12:05.653 回答
0

我也有同样的问题,并通过 HTML 使用了一个不间断的空间实体:

textView.setText("Magnifico" + Html.fromHtml("&nbsp;");
于 2018-07-20T10:10:52.637 回答
0

在我看来,如果您以编程方式应用斜体,它会正确包装内容。所以手动设置 TextView 的字体,例如在 kotlin 中:

textView.typeface = Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)
于 2019-11-14T15:12:20.647 回答
-3

在 TextView 的右侧添加 3dp 填充。我尝试了 1dp 和 2dp,但 3dp 似乎完全可以解决问题。

android:paddingRight="3dp"

于 2011-05-17T04:14:54.567 回答