在安卓中如何给字符串添加下标和上标

113

如何在不使用外部库的情况下打印带有上标或下标的字符串?我希望将其显示在Android的TextView中。


在ListView和它的TextView中使用这个技巧。 - Omid Omidi
15个回答

162

4
从技术上讲,它并不支持HTML,而是创建了一个Spanned,TextView支持这个功能。本质上,这是带有样式信息的CharSequences。 - Dandre Allison
1
这对我不起作用...但也许是因为我将它设置在我的strings.xml文件中。它为我编写了下标,但它被剪裁了,无论我放多少填充,它总是被剪裁。 - JPM
15
答案中的链接似乎不再相关。 - Pang
4
谢谢你的回复,但是下面使用SpannableStringBuilder的答案更好。 - Zach Sperske
1
根据Mir-Imaili的说法,您可以使用Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)调用相同的函数。 - Luca Murra
显示剩余2条评论

114

示例:

equation = (TextView) findViewById(R.id.textView1);
SpannableStringBuilder cs = new SpannableStringBuilder("X3 + X2");
cs.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
cs.setSpan(new RelativeSizeSpan(0.75f), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
cs.setSpan(new SuperscriptSpan(), 6, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
cs.setSpan(new RelativeSizeSpan(0.75f), 6, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
equation.setText(cs);

2
这看起来是正确的,谢谢分享!Html.fromHTML() 方法很方便,但上标并不更小。 - Daniel Schuler
这样会更好!Html.fromHtml方法可能导致上标文本被截断。 - Zach Sperske
当我使用这个方法来说100平方米,如equation.setText(blah+cs);时,它不起作用。但是分开使用却可以正常工作。如何让它起作用? - Nobody
远比 Html.fromHtml() 方法更好 - scienticious
请添加说明。 - Aryeetey Solomon Aryeetey

53

对于所有询问如何缩小字体的人,除了使用上标或下标之外,你只需要添加small标签即可。例如:

"X <sup><small> 2 </small></sup>"

23

在代码中添加"\u00B2",像这样:

textView.setText("X\u00B2");


你好,你的回答非常有帮助。但是,下标可以使用什么代码呢?另外,如果我想要在谷歌上搜索它们,这些代码叫什么?它们是 Unicode 吗? - Kolaaa
嗨,是Unicode,这里有一个包含所有Unicode的PDF文件 https://www.unicode.org/charts/PDF/U2070.pdf - Gerardo Salazar Sánchez

15

虽然有些晚了,但以下内容仍然有效,使用上标作为特殊字符,在此我使用了特殊字符。

<string name="str">H₂</string>

13
((TextView)findViewById(R.id.text)).setText(Html.fromHtml("X<sup><small>2</small></sup>")); 

(或)来自字符串资源文件:

<string name="test_string">
  <![CDATA[ X<sup><small>2</small></sup> ]]>
</string>

我是 Stack Overflow 的新手,在那时不知道如何使用。 - m.v.n.kalyani

13

已接受的答案现在已经过时了,请查看这段代码。我从某个网站上找到了这段代码,但我忘记了这个网站的名字,无论如何感谢这段有效的工作代码。

     SpannableString styledString
            = new SpannableString("Large\n\n"     // index 0 - 5
            + "Bold\n\n"          // index 7 - 11
            + "Underlined\n\n"    // index 13 - 23
            + "Italic\n\n"        // index 25 - 31
            + "Strikethrough\n\n" // index 33 - 46
            + "Colored\n\n"       // index 48 - 55
            + "Highlighted\n\n"   // index 57 - 68
            + "K Superscript\n\n" // "Superscript" index 72 - 83 
            + "K Subscript\n\n"   // "Subscript" index 87 - 96
            + "Url\n\n"           //  index 98 - 101
            + "Clickable\n\n");   // index 103 - 112

    // make the text twice as large
    styledString.setSpan(new RelativeSizeSpan(2f), 0, 5, 0);

    // make text bold
    styledString.setSpan(new StyleSpan(Typeface.BOLD), 7, 11, 0);

    // underline text
    styledString.setSpan(new UnderlineSpan(), 13, 23, 0);

    // make text italic
    styledString.setSpan(new StyleSpan(Typeface.ITALIC), 25, 31, 0);

    styledString.setSpan(new StrikethroughSpan(), 33, 46, 0);

    // change text color
    styledString.setSpan(new ForegroundColorSpan(Color.GREEN), 48, 55, 0);

    // highlight text
    styledString.setSpan(new BackgroundColorSpan(Color.CYAN), 57, 68, 0);

    // superscript
    styledString.setSpan(new SuperscriptSpan(), 72, 83, 0);
    // make the superscript text smaller
    styledString.setSpan(new RelativeSizeSpan(0.5f), 72, 83, 0);

    // subscript
    styledString.setSpan(new SubscriptSpan(), 87, 96, 0);
    // make the subscript text smaller
    styledString.setSpan(new RelativeSizeSpan(0.5f), 87, 96, 0);

    // url
    styledString.setSpan(new URLSpan("http://www.google.com"), 98, 101, 0);

    // clickable text
    ClickableSpan clickableSpan = new ClickableSpan() {

        @Override
        public void onClick(View widget) {
            // We display a Toast. You could do anything you want here.
            Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();

        }
    };

    styledString.setSpan(clickableSpan, 103, 112, 0);


    // Give the styled string to a TextView
    spantext = (TextView) findViewById(R.id.spantext);


    // this step is mandated for the url and clickable styles.
    spantext.setMovementMethod(LinkMovementMethod.getInstance());

    // make it neat
    spantext.setGravity(Gravity.CENTER);
    spantext.setBackgroundColor(Color.WHITE);

    spantext.setText(styledString);

注意:始终将android:textAllCaps="false"放在您的spantext中。


12

如果您想从string.xml文件设置上标,请尝试以下方法:

字符串资源:

<string name="test_string">X&lt;sup&gt;3&lt;/sup&gt;</string>

如果您想让上标更小:

<string name="test_string">X&lt;sup&gt;&lt;small&gt;3&lt;/small&gt;&lt;/sup&gt;</string>

代码:

textView.setText(Html.fromHtml("Anything you want to put here"+getString(R.string.test_string)));

6

Android字符串资源-字母上标和下标

如果您想要的任何字母都可以在此处找到,则确实不必使用HTML文档

对于“a”,请复制并粘贴“ᵃ”

您可以直接复制并粘贴任何这些上标和下标到您的Android字符串资源中。

例如:

    <string name="word_with_superscript" translatable="false">Trademark ᵀᴹ</string>

结果: 商标 ᵀᴹ

上标和下标字母

上标大写字母 ᴬ ᴮ ᴰ ᴱ ᴳ ᴴ ᴵ ᴶ ᴷ ᴸ ᴹ ᴺ ᴼ ᴾ ᴿ ᵀ ᵁ ⱽ ᵂ

上标小写字母 ᵃ ᵇ ᶜ ᵈ ᵉ ᶠ ᵍ ʰ ⁱ ʲ ᵏ ˡ ᵐ ⁿ ᵒ ᵖ ʳ ˢ ᵗ ᵘ ᵛ ʷ ˣ ʸ ᶻ

下标小写字母 ₐ ₑ ₕ ᵢ ⱼ ₖ ₗ ₘ ₙ ₒ ₚ ᵣ ₛ ₜ ᵤ ᵥ ₓ


5

HTML.fromHTML(String)在API 24中已经被弃用。他们建议使用支持flags参数的新方法。因此,根据已接受的答案:

TextView textView = ((TextView)findViewById(R.id.text));
textView.setText(Html.fromHtml("X<sup>2</sup>", Html.FROM_HTML_MODE_LEGACY));

如果您需要考虑早于Android 4.4的API,可以使用以下代码:

TextView textView = ((TextView)findViewById(R.id.text));
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
  textView.setText(Html.fromHtml("X<sup>2</sup>", Html.FROM_HTML_MODE_LEGACY));
} else {
    textView.setText(Html.fromHtml("X<sup>2</sup>"));    
}

这个答案来自于: https://dev59.com/_loU5IYBdhLWcg3wAjnV#37905107 关于标记和其他文档可以在这里找到: https://developer.android.com/reference/android/text/Html.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接