동일한 TextView에서 문자열의 다른 글꼴 크기


141

나는이 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의 크기가 나머지 텍스트와 다른 크기를 원합니다. 수행하는 방법?

답변:


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

이제 적용 span받는 string동일한에 추가 textview.


setSpan () 반환 : java.lang.IndexOutOfBoundsException : setSpan (0 ... 5)이 길이 1을 초과하여 끝납니다. 그 의미는 무엇입니까?
Adriana Carelli

문자열의 길이를 확인하십시오. IndexOutOfBoundsException : 범위 시작 및 종료에 대해 잘못된 인덱스 위치를 나타냅니다. 난 5 인덱스 0에서 스팬인가되도록 헬로 길이 위의 5
Raghunandan

Google Glass에서 완벽하게 작업했습니다!
Mohammad Arman

2
세로 방향으로 중앙에 작은 문자를 이동시키는 방법이 있습니까? 기본적으로 모든 문자는 크기에 관계없이 세로 가운데에 있어야합니다.
500865

이 경우 아마도 두 개의 텍스트 뷰가 필요하거나 직접 텍스트 뷰를 만들어야합니다.
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

@AmitGarg 정교하고 싶습니까?
Joao Sousa

4
AbsoluteSizeSpan(sizeInDip, true)dp에서 직접 크기를 지정할 수도 있습니다.
Ilia 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 ( "your html string")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ( "your html string")); }
statosdotcom

"5"의 단위는 무엇입니까? dp입니까? sp입니까? 그것들을 어떻게 그것들로 바꿀 수 있습니까?
안드로이드 개발자

그러나 색상과 가족 작품은 크기가 작동하지 않습니다.
C-

5

방법 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

여기에 이미지 설명을 입력하십시오



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

그리고 결과 :

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.