25

即使我android:layout_height="wrap_content"用于 TextView,Android TextView 也会剪掉我的文本下标(见下图)。是否有解决方法/解决方法?

替代文字

P/S:上标工作正常

注意:填充不起作用。

  • 我什至尝试添加50dip的填充,但没有帮助。
  • 我可以使用绝对高度,例如50dip,但是当我需要文本环绕时,这会搞砸一切。

示例代码:

mtTextView.setText(Html.fromHtml("HC0<sub>3</sub>"));

4

9 回答 9

26

大多数答案建议添加填充或使用较小的子/上标。这些可能是有用的解决方法,但它们并不能真正解决问题。理想情况下,我们希望 Android 在计算行高时考虑下标/上标。我想我找到了如何做到这一点,我正在与谷歌搜索这个问题的人分享它。

    SpannableStringBuilder sb = new SpannableStringBuilder("X2");
    sb.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(sb, BufferType.SPANNABLE);

诀窍在于 BufferType.SPANNABLE。显然它使 TextView 更加关注标记并正确计算行高。

于 2015-08-21T11:54:20.717 回答
21

这个解决方案对我有用。

上标文本通常在浏览器呈现时变小,这似乎不会在这里发生,因此您可以通过执行以下操作复制它(并解决此问题):

someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));
于 2011-10-06T14:25:32.663 回答
10

对于下标,需要对上述建议稍作改动,两个小标签:

    textView.setText(Html.fromHtml(
        "HCO<sub><small><small>3</small></small></sub>));
于 2012-01-12T00:53:39.903 回答
10

android:lineSpacingExtra="4dp" 应该解决它,这将在您的文本下方添加额外的行距,并防止下标被截断。我没有用上标尝试过,所以它现在可能会解决这个问题。

于 2013-08-24T20:51:10.513 回答
7

我有同样的问题,所以在阅读帖子后,我发现这是有效的。

示例:H 2 O
只需使用:

textView.setText(Html.fromHtml("H<sub>2</sub>O"),BufferType.SPANNABLE);

BufferType.SPANNABLE 很重要,因为它会告诉 textview 考虑上标跨度。

如果您使用 HTML 的自定义标签处理程序,您也可以像这样使用它:

 textView.setText(Html.fromHtml(data, null, new CustomHtmlTagHandler(),BufferType.SPANNABLE);

希望它可以帮助寻找同样问题的人。

于 2016-07-11T10:51:51.860 回答
1

我正在显示分数和混合数字,所以我同时使用超级和下标。Html.fromHtml 对我不起作用,它要么剪裁了顶部,要么剪裁了底部。

奇怪的是,混合数字可以正常工作,但分数本身却不能。

我最终使用了带有 SubscriptSpan 或 SuperscriptSpan 的 SpannableString,然后在 TextAppearanceSpan 中设置字体大小。

完成后,我还必须扩展 TextView 的高度。

TextView number = (TextView)findViewById(R.id.number);
String temp = "1 1/2";
SpannableString s = new SpannableString(temp);
// if the string has a fraction in it, superscript the numerator and subscript the denominator
if (temp.indexOf('/') != -1)
{
    int len = temp.length();
    s.setSpan(new SuperscriptSpan(), len - 3, len - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 3, len - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 2, len - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    s.setSpan(new SubscriptSpan(), len - 1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
number.setText(s);

然后我不得不扩大高度:

RelativeLayout.LayoutParams parms = (RelativeLayout.LayoutParams)number.getLayoutParams();
Rect frame = CalcSize(number.getTextSize(), quantityMaxString);
parms.height = frame.height() + fractionAdjustment;
number.setLayoutParams(parms);

CalcSize 返回显示元素数组中最大字符串的边界矩形。

fractionAdjustment 是一个根据经验选择的值,适用于为屏幕几何形状调整的选定字体大小。

注意:这是 TextView 在 ListView 内,因此也可能会产生一些影响。

// calculate the field dimensions, given the font size and longest string
private static Rect CalcSize(float fontSize, String maxString)
{
    Rect bounds = new Rect();
    paint.setTypeface(Typeface.DEFAULT);
    paint.setTextSize(fontSize);

    paint.getTextBounds(maxString, 0, maxString.length(), bounds);

    return bounds;
}

经验值:

fractionAdjustment = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, resources.getDisplayMetrics());
fractionFontSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 11, resources.getDisplayMetrics());
于 2011-10-14T20:06:34.397 回答
1

我在 ICS 及以下 android 版本中遇到了同样的问题。我通过一个简单的步骤解决了这个问题

给 Text View 一个最小高度。它将解决问题。

您可以通过 xml 设置最小高度。

        android:minHeight="30dp"

或动态

 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {

            tv.setMinHeight(52);
    }
于 2014-03-01T06:26:29.550 回答
1

这与Small标签一起对我有用。

  1. 在 TextView 里面添加

android:paddingBottom="1dp"

  1. 使用下标后的小Tag

yourTextView.setText(Html.fromHtml("" +" 嘿< sub >< small >2</small > < /sub >"));

注意请注意,第 1 步很重要,在某些情况下,我的文字仍然被删减,使用 paddingBottom 解决了它。不要忘记删除我的答案中存在的子标签和小标签中的空格:)

于 2016-08-04T20:22:19.807 回答
0

<small> </small> 标签的数量越多,下标就越小,您应该能够在不被剪裁的情况下看到它。

例如:H 2 O

Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");
于 2014-08-05T10:11:52.937 回答