带有wrap_contents的斜体TextView似乎在右边缘剪切文本

时间:2010-12-04 13:55:31

标签: android textview italic

<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上。

对我而言,它看起来像一个bug,但我只是一个Android初学者。 我试图向左右添加边距,但它仍然保持裁剪。 最后,我的黑客是在文本的两边添加一个空格。 还有其他解决方案吗?

14 个答案:

答案 0 :(得分:21)

您也可以使用Unicode no-break space character(\ u00A0)。

答案 1 :(得分:20)

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

启用italic文本后,包装的文本将尝试适合矩形,因此最右边的字符将被切除,除非其不可切割(例如.,{ {1}},)等。)

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

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

答案 2 :(得分:12)

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

答案 3 :(得分:6)

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

答案 4 :(得分:4)

找到另一个解决方案(在使用wrap_content时在4.1.2和4.3上测试)。如果您延长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());
}

答案 5 :(得分:3)

您可以为字符串添加头发空间

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

String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)

答案 6 :(得分:2)

这也适用于固定宽度的TextViews,而不仅仅是“wrap_content”。我不确定这个问题是否是特定于版本的问题,正如一些评论者提到的那样。我看到所有Honeycomb版本的问题。从我所看到的问题不会通过设置边距,填充,使用固定宽度或真正的自定义字体来消除。

答案 7 :(得分:1)

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

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

例如:

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

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

答案 8 :(得分:1)

这是我的解决方案:格式化textview和度量。在设置了textview的宽度后,用1个像素添加到测量的宽度。

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));

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

答案 9 :(得分:0)

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

textView.setText("Magnifico" + Html.fromHtml("&nbsp;");

答案 10 :(得分:0)

适当且干净的解决方案:

使用斜体自定义字体,而不是设置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

答案 11 :(得分:0)

在我看来,如果您以编程方式应用斜体字,则可以正确包装内容。因此请手动设置TextView的字体,例如在科特林:

textView.typeface = Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)

答案 12 :(得分:0)

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

答案 13 :(得分:-1)

在TextView的右侧添加一个3dp填充。我尝试使用1dp和2dp,但3dp似乎完全可以完成这个技巧。

android:paddingRight="3dp"