У меня есть textView
внутренняя часть с числом (переменной) и 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 имел размер, отличный от остального текста. Как сделать?
На всякий случай вам интересно, как вы можете установить несколько разных размеров в одном текстовом представлении, но используя абсолютный, а не относительный размер, вы можете добиться этого, используя
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
примеромAbsoluteSizeSpan(sizeInDip, true)
для указания размера прямо в dpВы можете сделать это, используя строку 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
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
источник
Попробуйте spannableStringbuilder . Используя это, мы можем создать строку с несколькими размерами шрифта.
источник
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
источник
Лучший способ сделать это - 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));
источник
Я написал свою собственную функцию, которая принимает 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; }
источник
Если вы хотите избежать путаницы для своих переводчиков, я придумал способ иметь просто заполнитель в строках, который будет обрабатываться в коде.
Итак, предположим, у вас есть это в строках:
<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
И результат:
источник
в котлине сделайте это, как показано ниже, используя html
HtmlCompat.fromHtml("<html><body><h1>This is Large Heading :-</h1><br>This is normal size<body></html>",HtmlCompat.FROM_HTML_MODE_LEGACY)
источник