簡體   English   中英

Android TextView 的下標被剪掉

[英]Android TextView's subscript being clipped off

即使我對 TextView 使用android:layout_height="wrap_content" ,Android TextView 也會剪掉我的文本下標(見下圖)。 是否有解決方案/解決方法?

替代文字

P/S:上標工作正常

注意:填充不起作用。

  • 我什至嘗試添加50dip的填充,但沒有幫助。
  • 我可以使用絕對高度,例如50dip,但是當我需要文本環繞時,這會把一切搞砸

示例代碼:

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

大多數答案建議添加填充或使用較小的子/上標。 這些可能是有用的解決方法,但它們並不能真正解決問題。 理想情況下,我們希望 Android 在計算行高時考慮下標/上標。 我想我找到了如何去做,我正在與谷歌搜索這個問題的人分享它。

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

訣竅在於 BufferType.SPANNABLE。 顯然它使 TextView 更加關注標記並正確計算行高。

這個解決方案對我有用。

上標文本在瀏覽器呈現時通常會變小,這似乎不會在這里發生,因此您可以通過執行以下操作來復制它(並解決此問題):

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

android:lineSpacingExtra="4dp" 應該解決這個問題,這將在文本下方添加額外的行距,並防止下標被截斷。 我還沒有用上標嘗試過,所以它現在可能會解決這個問題。

對於下標,需要對上述建議稍作改動,兩個小標簽:

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

我有同樣的問題,所以在閱讀帖子后,我發現這有效。

示例: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);

希望它可以幫助尋找同樣問題的人。

我在 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);
    }

這與Small標簽一起對我有用。

  1. 在 TextView 添加

機器人:paddingBottom =“1dp”

  1. 下標后使用小Tag

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

注意請注意,第 1 步很重要,我的文字在某些情況下仍然被削減,使用 paddingBottom 解決了它。 不要忘記刪除我的答案中存在的子標簽和小標簽中的空格:)

我顯示分數和混合數字,所以我同時使用超級和下標。 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 是一個憑經驗選擇的值,適用於為屏幕幾何形狀調整的選定字體大小。

注意:這是在 ListView 中的 TextView,因此也可能會產生一些影響。

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

<small> </small> 標簽的數量越多,下標就越小,您應該能夠看到它而不會被剪裁。

例如:H 2 O

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM