同一TextView中字符串的不同字体大小


141

我的textView内部有一个数字(变量)和a string,如何给数字大一个比大小大的数字string?代码:

TextView size = (TextView)convertView.findViewById(R.id.privarea_list_size);
if (ls.numProducts != null) {
    size.setText(ls.numProducts + " " + mContext.getString(R.string.products));
}

我希望ls.numproducts的大小与文本的其余部分不同。怎么做?

Answers:


360

用一个 Spannable String

 String s= "Hello Everyone";
 SpannableString ss1=  new SpannableString(s);
 ss1.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
 ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
 TextView tv= (TextView) findViewById(R.id.textview);
 tv.setText(ss1); 

快照

在此处输入图片说明

您可以使用空格分割字符串并将跨度添加到所需的字符串。

 String s= "Hello Everyone";  
 String[] each = s.split(" ");

现在适用spanstring并添加到相同textview


setSpan()返回:java.lang.IndexOutOfBoundsException:setSpan(0 ... 5)结束于长度1。这是什么意思?
Adriana Carelli

检查字符串的长度。IndexOutOfBoundsException:指示范围的开始和结束的索引位置错误。在上面的Hello长度是5,所以我应用了从索引0到5的跨度
Raghunandan

在Google Glass上完美工作!
Mohammad Arman

2
有没有办法将较小的字符沿垂直方向移动到中心?基本上,所有字符都应垂直居中,而不管其大小如何。
500865 2016年

在这种情况下,您可能需要两个文本视图,否则您需要创建自己的文本视图
Raghunandan

119

万一您想知道如何在同一个文本视图中设置多个不同的大小,但是使用绝对大小而不是相对大小,则可以使用AbsoluteSizeSpan而不是RelativeSizeSpan

只需获得所需文本大小的尺寸(以像素为单位)

int textSize1 = getResources().getDimensionPixelSize(R.dimen.text_size_1);
int textSize2 = getResources().getDimensionPixelSize(R.dimen.text_size_2);

然后AbsoluteSpan根据文本创建一个新的

String text1 = "Hi";
String text2 = "there";

SpannableString span1 = new SpannableString(text1);
span1.setSpan(new AbsoluteSizeSpan(textSize1), 0, text1.length(), SPAN_INCLUSIVE_INCLUSIVE);

SpannableString span2 = new SpannableString(text2);
span2.setSpan(new AbsoluteSizeSpan(textSize2), 0, text2.length(), SPAN_INCLUSIVE_INCLUSIVE);

// let's put both spans together with a separator and all
CharSequence finalText = TextUtils.concat(span1, " ", span2);

很好的AbsoluteSizeSpan例子
eugeneek '16

您想详细说明@AmitGarg吗?
Joao Sousa

4
您还可以使用AbsoluteSizeSpan(sizeInDip, true)直接在DP指定大小
伊利亚Grabko

8

您可以使用html字符串完成此操作,然后使用html将其设置为Textview
txtView.setText(Html.fromHtml("Your html string here"));

例如 :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`

1
不错的贡献!但是从现在起不推荐使用fromHtml(API> = N)。为此,请执行以下操作以允许兼容模式:if(android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N){txtView.setText(Html.fromHtml(“ html字符串”)) ,Html.FROM_HTML_MODE_LEGACY));} else {txtView.setText(Html.fromHtml(“您的html字符串”))); }
statosdotcom's

“ 5”的单位是什么?是dp吗?是sp吗?如何将其更改为任何一个?
android开发人员

5

方法一

public static void increaseFontSizeForPath(Spannable spannable, String path, float increaseTime) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new RelativeSizeSpan(increaseTime), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

使用

Utils.increaseFontSizeForPath(spannable, "big", 3); // make "big" text bigger 3 time than normal text

在此处输入图片说明

方法2

public static void setFontSizeForPath(Spannable spannable, String path, int fontSizeInPixel) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new AbsoluteSizeSpan(fontSizeInPixel), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

使用

Utils.setFontSizeForPath(spannable, "big", (int) textView.getTextSize() + 20); // make "big" text bigger 20px than normal text

在此处输入图片说明



3
private SpannableStringBuilder SpannableStringBuilder(final String text, final char afterChar, final float reduceBy) {
        RelativeSizeSpan smallSizeText = new RelativeSizeSpan(reduceBy);
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
        ssBuilder.setSpan(
                smallSizeText,
                text.indexOf(afterChar),
                text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );

        return ssBuilder;
    }
------------------------
TextView textView =view.findViewById(R.id.textview);
String s= "123456.24";
textView.setText(SpannableStringBuilder(s, '.', 0.7f));

----------------结果---------------

结果:

12345. 24


2

最好的方法是Html,而无需对文本进行子字符串化和完全动态化,例如:

  public static String getTextSize(String text,int size) {
         return "<span style=\"size:"+size+"\" >"+text+"</span>";

    }

并且您可以使用颜色属性等...如果另一只手:

size.setText(Html.fromHtml(getTextSize(ls.numProducts,100) + " " + mContext.getString(R.string.products));  

1

我已经编写了自己的函数,该函数需要2个字符串和1个int(文本大小)

要更改其大小的全文本和部分文本。

它返回一个SpannableStringBuilder,您可以在文本视图中使用它。

  public static SpannableStringBuilder setSectionOfTextSize(String text, String textToChangeSize, int size){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToChangeSize.length() > 0 && !textToChangeSize.trim().equals("")){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToChangeSize.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex < 0 || endingIndex <0){
                return builder.append(text);
            }
            else if(startingIndex >= 0 && endingIndex >=0){

                builder.append(text);
                builder.setSpan(new AbsoluteSizeSpan(size, true), startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }else{
            return builder.append(text);
        }

        return builder;
    }

0

如果您希望避免给翻译人员带来太多混乱,我想出了一种在字符串中仅包含占位符的方法,该方法将在代码中处理。

因此,假设您在字符串中包含以下内容:

    <string name="test">
        <![CDATA[
        We found %1$s items]]>
    </string>

如果您希望占位符文本具有不同的大小和颜色,则可以使用以下命令:

        val textToPutAsPlaceHolder = "123"
        val formattedStr = getString(R.string.test, "$textToPutAsPlaceHolder<bc/>")
        val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
        val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
        val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
            var start = 0
            override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
                when (tag) {
                    "bc" -> if (!opening) start = output.length - textToPutAsPlaceHolder.length
                    "html" -> if (!opening) {
                        output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
                        output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
                    }
                }
            }
        })
        textView.text = textToShow

结果是:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.