Android TextView的下标被剪掉
解决方案
这个解决方案 为我工作。
当浏览器渲染时,上标文本通常会变小,但这里似乎不会发生这种情况,因此您可以通过执行以下操作来复制它(并解决此问题):
someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));
其他提示
大多数答案建议添加填充或使用较小的子/上标。这些可能是有用的解决方法,但它们并不能真正解决问题。理想情况下,我们希望 Android 在计算行高时考虑下标/上标。我想我找到了如何做到这一点,并且我将其分享给那些在谷歌上搜索此问题的人。
SpannableStringBuilder sb = new SpannableStringBuilder("X2");
sb.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(sb, BufferType.SPANNABLE);
诀窍在于 BufferType.SPANNABLE。显然,它使 TextView 更加关注标记并正确计算行高。
对于下标,需要对上述建议稍作修改,两个小标签:
textView.setText(Html.fromHtml(
"HCO<sub><small><small>3</small></small></sub>));
Android:lines -pacingextra =“ 4DP”应该解决,这将在文本下方添加额外的线间距,并防止下标截止。我还没有尝试过使用上标,所以现在可能会解决这个问题。
我也遇到了同样的问题,所以在阅读了帖子后,我发现这是有效的。
例子 :H2氧
只需使用:
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);
希望它可以帮助正在寻找同样问题的人。
我显示分数和带分数,因此我同时使用超级和下标。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());
我在 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);
}
这对我有用 小的 标签。
- 在 TextView 里面添加
机器人:paddingBottom =“1dp”
- 在下标后使用小标签
yourTextView.setText(Html.fromHtml("" +" 嘿< sub >< 小 >2</small > </sub >"));
笔记 请注意,第 1 步很重要,在某些情况下我的文本仍然被削减,使用 paddingBottom 解决了它。不要忘记删除我的答案中存在的子标签和小标签中的空格:)
其中 <small> </small> 标签的数量越多,下标就会越小,您应该能够看到它而不会被剪切。
例如:H2氧
Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");