【问题标题】:Android TextView's subscript being clipped offAndroid TextView 的下标被剪掉
【发布时间】:2010-12-17 05:07:50
【问题描述】:

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

P/S:上标工作正常

注意: 填充不起作用。

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

示例代码:

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

【问题讨论】:

  • 您可以尝试粘贴您的代码吗?
  • mtTextView.setText(Html.fromHtml("HC03"));
  • 给未来读者的注意事项 - 作者已将错误提交给 android bugtracker,您可以添加一个开始以提高其优先级code.google.com/p/android/issues/detail?id=4855

标签: android textview subscript


【解决方案1】:

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

  1. 在TextView里面添加

android:paddingBottom="1dp"

  1. 在下标后使用小Tag

yourTextView.setText(Html.fromHtml("" +" 嘿2 "));

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,所以在阅读了帖子后,我发现这是可行的。

    示例:H2O
    只需使用:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 嘿,我的字符串为X2 X3 X4,这在我的情况下不起作用。我只使用SuperscriptSpan()
      【解决方案4】:

      标签的数量越多,下标就越小,你应该可以看到它而不会被剪裁。

      例如:H2O

      Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");
      

      【讨论】:

        【解决方案5】:

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

        给文本视图一个最小高度。它会解决问题。

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

                android:minHeight="30dp"
        

        或动态

         if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        
                    tv.setMinHeight(52);
            }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我正在显示分数和带分数,所以我同时使用超标和下标。 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());
            

            【讨论】:

            • 你能展示一下CalcSize函数的样子和fractionAdjustment、fractionFontSize变量吗?不确定您的经验选择值是什么意思。你能给出一个具体的值吗?
            • 我会看看这个答案而不是stackoverflow.com/a/9055533/346309
            【解决方案8】:

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

                textView.setText(Html.fromHtml(
                    "HCO<sub><small><small>3</small></small></sub>));
            

            【讨论】:

            • 嵌套“”的数量取决于您的文本有多大。我设法通过添加 3x 摆脱剪辑效果
            • 无需添加多个小标签。只需在 TextView 中添加 android:paddingBottom="2dp" 。这对我来说效果很好
            【解决方案9】:

            This solution 为我工作。

            浏览器渲染时,上标文本通常会变小,这似乎不会在这里发生,因此您可以通过这样做来复制(并解决此问题):

            someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));
            

            【讨论】:

            • 这对我不起作用......但也许是因为我将它设置在我的 strings.xml 文件中。它为我下标,但它会剪辑它,无论我放多少填充,它总是被剪辑。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-07
            • 2020-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-03
            • 2013-12-05
            相关资源
            最近更新 更多