【问题标题】:Italic TextView with wrap_contents seems to clip the text at right edge带有 wrap_contents 的斜体 TextView 似乎在右边缘剪辑文本
【发布时间】:2011-05-20 05:22:51
【问题描述】:
<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 初学者。 我试图在左右两边添加边距,但它仍然在剪裁。 最后,我的破解方法是在文本的两侧添加一个空格。 还有其他解决方案吗?

【问题讨论】:

标签: android textview italic


【解决方案1】:

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

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

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

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

【讨论】:

  • 这太不可思议了……为什么,Android 先生?告诉我这是一个错误,它将被修复..
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是唯一可靠的解决方法。如果您使用资源字符串,尾随空格将被删除(为什么要这样做?)所以这没有任何效果,但斜线会处理这个问题。
    • 我不认为这是 XML 的转义字符,至少我在这里没有看到它:en.wikipedia.org/wiki/… 但这绝对对我有用!我想知道为什么。
    【解决方案4】:

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

    【讨论】:

    • 使用 setTextSkewX(这是另一种斜体文本的方法)遇到了同样的问题。这也解决了这个问题。
    【解决方案5】:

    找到另一个解决方案(在 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());
    }
    

    【讨论】:

      【解决方案6】:

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

      <string name="hair_space">&#x200A;</string>
      
      String hairSpace = getContext().getString(R.string.hair_space);
      textView.setText(hairSpace + originalString + hairSpace)
      

      【讨论】:

      • 这很好用,谢谢!我讨厌 Google 强迫我们做的这些黑客行为!
      【解决方案7】:

      适当且干净的解决方案:

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

      【讨论】:

      • 最佳解决方案
      【解决方案8】:

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

      【讨论】:

      • 现在通过在 XML 中设置 true-italic 字体确实会消失。感谢您的提示。检查我的答案。
      【解决方案9】:

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

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

      例如:

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

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

      【讨论】:

      • 已编辑:移除倾斜
      【解决方案10】:

      这是我的解决方案:格式化 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));
      

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

      【讨论】:

      • 这是一个合适的解决方案,而不是 hack
      【解决方案11】:

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

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

      【讨论】:

      • fromHtml(String) 在 API 24 中已弃用
      【解决方案12】:

      在我看来,如果您以编程方式应用斜体,它会正确地进行内容换行。所以手动设置 TextView 的字体,例如在科特林中:

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

      【讨论】:

        【解决方案13】:

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

        【讨论】:

          【解决方案14】:

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

          android:paddingRight="3dp"

          【讨论】:

          • 填充似乎不会影响文本剪辑矩形,至少在 2.3 上不会。
          • 对于应用程序的标题(在我的情况下为 ActionBarSherlock)相同,这使得自定义标题 TextView 变得不那么简单。但是感谢您的尝试。
          猜你喜欢
          • 2014-01-25
          • 2020-02-16
          • 1970-01-01
          • 2019-03-19
          • 2017-01-10
          • 1970-01-01
          • 2023-01-11
          • 2018-03-07
          • 1970-01-01
          相关资源
          最近更新 更多