동일한 TextView에서 문자열의 글꼴 크기가 다름
저는.textView안에 숫자(variable)와 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.num 제품이 나머지 텍스트와 크기가 다르길 원합니다.어떻게 하죠?
사용.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(" ");
이제 적용합니다.span에게string에 동일한 것을 추가합니다.textview.
동일한 텍스트 뷰에서 여러 개의 다른 크기를 설정할 수 있는 방법이 궁금할 경우 상대적인 크기가 아닌 절대 크기를 사용하면 다음 대신 사용할 수 있습니다.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);
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>"));`
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
방법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
이를 위한 가장 좋은 방법은 텍스트와 완전한 동적을 포함하지 않는 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개와 int(텍스트 크기) 1개가 필요한 함수를 직접 작성하였습니다.
전체 텍스트와 텍스트의 크기를 변경할 부분.
텍스트 보기에서 사용할 수 있는 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;
    }
코틀린 애호가를 위한 유틸리티 방법
fun String.setFontSizeForPath(path: String, fontSizeInPixel: Int, colorCode: String = "#FF0000"): SpannableString {
    val spannable = SpannableString(this)
    val startIndexOfPath = spannable.toString().indexOf(path)
    spannable.setSpan(
        AbsoluteSizeSpan(fontSizeInPixel),
        startIndexOfPath,
        startIndexOfPath + path.length,
        0
    )
    spannable.setSpan(
        ForegroundColorSpan(Color.parseColor(colorCode)),
        startIndexOfPath,
        startIndexOfPath + path.length,
        0
    )
    return spannable
}
사용하다
text_view.text = "A B C D".setFontSizeForPath("B",30)
private SpannableString getFormattedText(String textToBold, String normalText, boolean boldTextFirst) {
    String result = boldTextFirst ? textToBold + normalText : normalText + textToBold;
    SpannableString str = new SpannableString(result);
    Typeface typeface = ResourcesCompat.getFont(requireContext(), R.font.product_sans_bold);
    int style = typeface != null ? typeface.getStyle() : Typeface.BOLD;
    int textToBoldStartIndex = str.toString().indexOf(textToBold);
    str.setSpan(new StyleSpan(style), textToBoldStartIndex, textToBoldStartIndex + textToBold.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    int normalTextStartIndex = str.toString().indexOf(normalText);
    str.setSpan(new AbsoluteSizeSpan(13, true), normalTextStartIndex, normalTextStartIndex + normalText.length(), 0);
    return str;
}
@Anandharaj R 답변에 대한 Kotlin 버전.
class SpannableStringBuilderHelper {
companion object {
    fun reduceTextSizeAfterChar(text: String, afterChar: Char, reduceBy: Float): SpannableStringBuilder? {
        val smallSizeText = RelativeSizeSpan(reduceBy)
        val ssBuilder = SpannableStringBuilder(text)
        ssBuilder.setSpan(
            smallSizeText,
            text.indexOf(afterChar),
            text.length,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )
        return ssBuilder
    }
}
}
용도:
SpannableStringBuilderHelper.reduceTextSizeAfterChar("70/100", '/', 0.7f)
번역자에게 너무 혼란을 주지 않으려면 문자열에 자리 표시자만 둘 수 있는 방법을 생각해 냈는데요.
그래서, 당신이 이걸 가지고 있다고 가정했을 때:
    <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
결과는 다음과 같습니다.
kotlin에서 html을 사용하여 아래와 같이 합니다.
HtmlCompat.fromHtml("<html><body><h1>This is Large Heading :-</h1><br>This is normal size<body></html>",HtmlCompat.FROM_HTML_MODE_LEGACY)
언급URL : https://stackoverflow.com/questions/16335178/different-font-size-of-strings-in-the-same-textview
'programing' 카테고리의 다른 글
| Spring @SubscribeMapping이 정말로 어떤 주제에 대해 고객을 구독합니까? (0) | 2023.10.26 | 
|---|---|
| MYSQL 문 최적화 (0) | 2023.10.26 | 
| 헤더가 없는 파워셸 내보내기-csv? (0) | 2023.10.26 | 
| Youtube api v3 오류 "이 작업을 수행하려면 SSL이 필요합니다." (0) | 2023.10.26 | 
| 워드프레스 위젯에서 자동 문단 제거 (0) | 2023.10.26 | 


