TextView 안에 여러 스타일을 가질 수 있습니까? Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); //

TextView 내부의 다른 텍스트 조각에 여러 스타일을 설정할 수 있습니까?

예를 들어 텍스트를 다음과 같이 설정하고 있습니다.

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

각 텍스트 요소마다 다른 스타일을 가질 수 있습니까? 예를 들어, line1 굵게, word1 기울임 꼴 등

개발자 안내서의 일반적인 작업 및 Android에서의 작업 방법 에는 텍스트 선택, 강조 표시 또는 스타일링이 포함됩니다 .

// Get our EditText object.
EditText vw = (EditText)findViewById(R.id.text);

// Set the EditText's text.
vw.setText("Italic, highlighted, bold.");

// If this were just a TextView, we could do:
// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
// to force it to use Spannable storage so styles can be attached.
// Or we could specify that in the XML.

// Get the EditText's internal text storage
Spannable str = vw.getText();

// Create our span sections, and assign a format to each.
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

그러나 그것은 텍스트 안에 명시적인 위치 번호를 사용합니다. 더 깔끔한 방법이 있습니까?



답변

누구 든지이 작업을 수행하는 방법을 궁금해하는 경우 한 가지 방법이 있습니다. (Mark 다시 감사합니다!)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" +
            "<small>" + description + "</small>" + "<br />" +
            "<small>" + DateAdded + "</small>"));

이 메소드에서 지원하는 비공식 태그 목록은 이 링크 또는 다음 질문을 참조하십시오 . Android TextView가 지원하는 HTML 태그는 무엇입니까?


답변

을 시도 Html.fromHtml()하고 굵고 기울임 꼴 HTML 태그로 텍스트를 마크 업하십시오. 예 :

Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);

답변

주제를 약간 벗어 났지만 여기서 언급하지 않은 것이 너무 유용하다는 것을 알았습니다.

string.xml 리소스 에서 Html 텍스트를 읽고 지역화하기 쉽게하려면 어떻게해야합니까? CDATA 는이를 가능하게합니다.

<string name="my_text">
  <![CDATA[
    <b>Autor:</b> Mr Nice Guy<br/>
    <b>Contact:</b> myemail@grail.com<br/>
    <i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
  ]]>
</string> 

Java 코드에서 다음과 같이 활용할 수 있습니다.

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

나는 이것이 효과가 있다고 기대하지 않았다. 그러나 그것은했다.

그것이 당신 중 일부에게 유용하기를 바랍니다!


답변

html을 사용하고 싶지 않다면 styles.xml을 만들고 다음과 같이 사용할 수 있습니다.

TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(text, TextView.BufferType.SPANNABLE);

답변

SpannableStringhtml 마크 업 대신 사용하는 것이 더 가볍습니다 . 시각적 예제를 보는 데 도움이되므로 여기에 보충 답변이 있습니다.

이것은 단일 TextView입니다.

// set the text
SpannableString s1 = new SpannableString("bold\n");
SpannableString s2 = new SpannableString("italic\n");
SpannableString s3 = new SpannableString("foreground color\n");
SpannableString s4 = new SpannableString("background color\n");
SpannableString s5 = new SpannableString("underline\n");
SpannableString s6 = new SpannableString("strikethrough\n");
SpannableString s7 = new SpannableString("bigger\n");
SpannableString s8 = new SpannableString("smaller\n");
SpannableString s9 = new SpannableString("font\n");
SpannableString s10 = new SpannableString("URL span\n");
SpannableString s11 = new SpannableString("clickable span\n");
SpannableString s12 = new SpannableString("overlapping spans\n");

// set the style
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), flag);
s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), flag);
s3.setSpan(new ForegroundColorSpan(Color.RED), 0, s3.length(), flag);
s4.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, s4.length(), flag);
s5.setSpan(new UnderlineSpan(), 0, s5.length(), flag);
s6.setSpan(new StrikethroughSpan(), 0, s6.length(), flag);
s7.setSpan(new RelativeSizeSpan(2), 0, s7.length(), flag);
s8.setSpan(new RelativeSizeSpan(0.5f), 0, s8.length(), flag);
s9.setSpan(new TypefaceSpan("monospace"), 0, s9.length(), flag);
s10.setSpan(new URLSpan("https://developer.android.com"), 0, s10.length(), flag);
s11.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Toast.makeText(getApplicationContext(), "Span clicked", Toast.LENGTH_SHORT).show();
    }
}, 0, s11.length(), flag);
s12.setSpan(new ForegroundColorSpan(Color.RED), 0, 11, flag);
s12.setSpan(new BackgroundColorSpan(Color.YELLOW), 4, s12.length(), flag);
s12.setSpan(new UnderlineSpan(), 4, 11, flag);

// build the string
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);
builder.append(s5);
builder.append(s6);
builder.append(s7);
builder.append(s8);
builder.append(s9);
builder.append(s10);
builder.append(s11);
builder.append(s12);

// set the text view with the styled text
textView.setText(builder);
// enables clicking on spans for clickable span and url span
textView.setMovementMethod(LinkMovementMethod.getInstance());

추가 연구

이 예제는 원래 여기 에서 영감을 받았습니다 .


답변

지원되는 태그 목록은 다음과 같습니다.

문자열 리소스를 사용하는 경우 HTML 표기법을 사용하여 굵게 또는 기울임 꼴과 같은 간단한 스타일을 추가 할 수 있습니다. 현재 지원되는 태그는 다음과 같습니다 B(굵게), I(이탤릭체), U(밑줄), TT(고정 폭), BIG, SMALL, SUP(첨자), SUB(첨자) 및 STRIKE(취소). 예를 들어 res/values/strings.xml다음과 같이 선언 할 수 있습니다.

<resource>
    <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

( http://developer.android.com/guide/faq/commontasks.html#selectingtext — 웹 아카이브 링크에서 <resource>오타는 독창적입니다!)

또한 Html.fromHtml간단한 경우에는 실제로 필요하지 않음을 보여줍니다 .


답변

나는 같은 문제에 부딪쳤다. fromHtml을 사용할 수는 있지만 지금은 웹이 아니라 안드로이드입니다. 그래서 이것을 시도하기로 결정했습니다. 나는 이것을 현지화해야하므로 문자열 대체 개념을 사용하여 샷을주었습니다. TextView의 스타일을 기본 스타일로 설정 한 다음 다른 조각의 서식을 지정하십시오.

이것이 다른 사람들이 똑같은 일을하는 데 도움이되기를 바랍니다. 왜 이것이 프레임 워크에서 쉽지 않은지 모르겠습니다.

내 문자열은 다음과 같습니다


<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>

스타일은 다음과 같습니다.


<style name="MainStyle">
    <item name="android:textSize">@dimen/regular_text</item>
    <item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
    <item name="android:textSize">@dimen/paragraph_bullet</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

내 formatStyles 메서드를 호출하는 코드는 다음과 같습니다.


SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

형식화 방법 :


private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
    String tag0 = "{0}";
    int startLocation0 = value.indexOf(tag0);
    value = value.replace(tag0, sub0);

    String tag1 = "{1}";
    int startLocation1 = value.indexOf(tag1);
    if (sub1 != null && !sub1.equals(""))
    {
        value = value.replace(tag1, sub1);
    }

    SpannableString styledText = new SpannableString(value);
    styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    if (sub1 != null && !sub1.equals(""))
    {
        styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return styledText;
}