Android 带换行内容的斜体文本视图似乎在右边缘剪裁文本

Android 带换行内容的斜体文本视图似乎在右边缘剪裁文本,android,textview,italic,Android,Textview,Italic,至少在480x800 emulator或Nexus One上,似乎从最右边的字符剪裁了几个像素 对我来说,这看起来像一个bug,但我只是一个Android初学者。 我试着在左边和右边添加边距,但它仍然在剪辑。 最后,我的破解方法是在文本的两侧添加一个空格。 还有其他解决方案吗?android:layout\u width=“wrap\u content”为您提供了一个矩形,用于包装内容渲染。 所有这些都适用于普通文本(非斜体) 启用斜体文本后,包装的文本将尝试放入矩形中,因此最右边的字符将被剪切

至少在480x800 emulator或Nexus One上,似乎从最右边的字符剪裁了几个像素

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

android:layout\u width=“wrap\u content”为您提供了一个矩形,用于包装内容渲染。 所有这些都适用于普通文本(非斜体)

启用
斜体
文本后,包装的文本将尝试放入矩形中,因此最右边的字符将被剪切,除非其不可剪切(例如
1
等)

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


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

我在mystrings.xml中所有字符串的末尾添加了
“\”
\
是转义字符,因此我可以通过这种方式解决问题,但这种解决方案很糟糕。希望这有帮助。

在文本视图的右侧添加一个3dp填充。我尝试了1dp和2dp,但3dp似乎完全做到了这一点


android:paddingRight=“3dp”

这也适用于固定宽度的文本视图,而不仅仅是“包装内容”。我不确定这个问题是否像一些评论所提到的那样是版本特定的。我在所有蜂巢版本上都看到了这个问题。据我所知,设置边距、填充、使用固定宽度或真正的斜体自定义字体都不会消除这个问题。

您也可以使用(\u00A0)。

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

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

一个技巧是在角色的正上方设置一个不可见的阴影

例如:

<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"
    />
textView.setText("Magnifico" + Html.fromHtml("&nbsp;");
我认为这个解决方案更好,因为它不会扩展
文本视图的宽度,这在添加额外字符时可能会发生(在背景中更明显)。

找到了另一个解决方案(在使用
包装内容时在4.1.2和4.3上进行了测试)。如果扩展
TextView
EditText
类,则可以通过以下方式重写
onMeasure
方法:

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

这是我的解决方案:格式化textview和measure。在此之后,设置textview的宽度(1个像素),将其添加到测量的宽度

@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());
}

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

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

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));
 ;
String hairSpace=getContext().getString(R.String.hair\u space);
textView.setText(发际空间+原始字符串+发际空间)

我也有同样的问题,通过HTML使用了一个非中断空格实体:

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

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

合适且干净的解决方案:

使用斜体自定义字体,而不是设置textStyle='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"
    />
textView.setText("Magnifico" + Html.fromHtml("&nbsp;");

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

无需任何破解即可工作

这里有一个指责textStyle属性的证据:

我制作了一个自定义字体系列,定义了普通、粗体和斜体的字体

res/font/app\u font\u family.xml


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

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


这是Api 23上的支持库28.0.0和Android Studio 3.2。在我看来,如果以编程方式应用斜体,它可以正确地包装内容。因此,手动设置TextView的字体,例如在kotlin中:

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

虽然我通常更喜欢使用真正的斜体字体,但这些字体并不总是可用。

由于当前的问题是由于对文本边界的错误测量造成的,我只设置了
android:layout\u width=“0dp”
,为文本视图提供了所需的水平空间。这在所有情况下可能都不理想,但在许多情况下,这是一个简单且不太老套的解决方案。

你能发布你所看到的图像吗?看到你提到的最右边的“o”页边距了吗?你的意思是填充吗?这个问题也是窃听方法。这是唯一可靠的解决方法。如果使用资源字符串,尾随空格将被删除(为什么会这样做?),因此没有任何效果,但斜杠会解决这个问题。我不认为这是XML的转义字符,至少我在这里没有看到它:但这对我来说确实有效!我想知道为什么。填充似乎不会影响文本剪辑rect,至少在2.3上不会。应用程序的标题(在我的例子中是ActionBarSherlock)也是如此,这使得自定义标题文本视图变得不那么简单。但是感谢您的尝试。使用setTextSkewX(这是另一种斜体化文本的方法)也有同样的问题。这也解决了这个问题。编辑:删除DIPST这很好,谢谢!我讨厌谷歌强迫我们做的这些黑客行为!在API 24中不推荐使用fromHtml(字符串)。这是一个合适的解决方案,而不是一个黑客程序。现在,通过在XML中设置真正的斜体字体,它确实消失了。谢谢你的提示。检查我的答案。最好的解决方案这是难以置信的。。。为什么,安卓先生?告诉我这是一个bug,它会被修复的。。