XML 형식의 html 형식 문자열 리소스에서 TextView 텍스트 설정


196

내 안에 고정 문자열이 있습니다 strings.xml.

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>

그리고 내 레이아웃 TextView에는 html 형식 문자열로 채우고 싶은 것이 있습니다.

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>

이 작업을 수행하면 내용은 HTML 태그 formattedtextsomestring제거되어 형식이 지정되지 않은 내용입니다.

형식이 지정된 텍스트를 프로그래밍 방식으로 설정할 수 있음을 알고 있습니다.

.setText(Html.fromHtml(somestring));

프로그램의 다른 부분에서 예상대로 작동하기 때문에 이것을 사용하기 때문입니다.

이 함수를 호출하려면을 필요로 Activity하지만 현재 레이아웃은 일반 XML의 단순한 정적 뷰 일 Activity뿐이며 일부를 설정하기 위한 오버 헤드를 피하기 위해 그런 식으로 두는 것이 좋습니다. 본문.

내가 명백한 것을 내려다보고 있습니까? 전혀 가능하지 않습니까? 도움이나 해결 방법을 환영합니다!

편집 : 그냥 몇 가지를 시도해 보았고 XML의 HTML 형식에는 약간의 제약이있는 것 같습니다.

  • 태그는 소문자로 작성해야합니다

  • 여기 에 언급 된 일부 태그가 작동하지 않습니다 <br/>( 예 : \n대신 사용할 수 있음 )


1
오래 전부터 알고 있지만 TextView에 html을 사용하여 새 줄에 \ n이 아닌 <br>을 사용할 수있었습니다.
Tam

2
이 작업은 XML에서만 가능합니까? 나는 대답에 작은 현상금이 있습니다. 나는 이미 그 주위에 코딩 한 시점에서 사실적인 대답으로 받아들이지 않을 것입니다.
danny117

1
아무도 그 질문에 실제로 대답하지 않았다는 것이 흥미 롭습니다. OP는 fromHtml ()을 사용하여 작업을 수행하는 방법을 알고 있지만 레이아웃 파일에서 직접 수행하려고한다고 말합니다 (이유가 좋지는 않지만 ... 화면). 앵커 태그의 영향에 대한 답도 없습니다.
lilbyrdie

답변:


481

누군가가 이것을 발견하면 문서화되지 않은 더 좋은 대안이 있습니다 (시간을 검색 한 후 넘어서 마침내 Android SDK 자체의 버그 목록에서 찾았습니다). 당신은 CAN 당신이 그것을 포장뿐만 strings.xml의 원시 HTML을 포함

<![CDATA[ ...raw html... ]]>

예:

<string name="nice_html">
<![CDATA[
<p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p>
<p>This is another paragraph of the same string.</p>
]]>
</string>

그런 다음 코드에서 :

TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html)));

IMHO, 이것은 작업하기에 더 좋은 몇 가지 크기입니다 :-)


26
추가하기 위해 CDATA 블록 내에서 백 슬래시 이스케이프 아포스트로피 / 단일 따옴표를 사용할 수도 있으므로 무한히 못생긴 <b> can''t't < / b>
Bitbang3r

5
여전히 작동합니까? 방금 시도한 결과 문자 그대로 <p> 및 </ p>가 표시됩니다.
페리 하트만

1
@PeriHartman Html.fromHtml(getString(R.string.nice_html))비트 도 했습니까 ? :)
비동기

1
TextView foo = (TextView) findViewById (R.id.foo); foo.setText (Html.fromHtml (getString (R.string.nice_html))); 가야 해?
RustyIngles

2
"Html.fromHtml"을 피하는 방법이 있습니까?
안드로이드 개발자

128

여기에 가장 좋은 대답은 잘못된 것을 제안하고 있거나 적어도 너무 복잡하기 때문에 질문이 꽤 오래되었지만 업데이트해야한다고 생각합니다.

Android에서 문자열 리소스를 getString(...)사용하는 경우 Java 코드에서 호출 하거나 android:text="@string/..."레이아웃 XML에서 사용해야 합니다.

문자열에서 HTML 마크 업을 사용하려는 경우에도 크게 변경할 필요가 없습니다.

String 리소스에서 이스케이프해야하는 유일한 문자는 다음과 같습니다.

  • 큰 따옴표는 : "이된다\"
  • 작은 따옴표는 : '이된다\'
  • 앰퍼샌드 : &되고 &#38;또는&amp;

즉 , 태그 를 이스케이프하지 않고 HTML 마크 업을 추가 할 수 있습니다 .

<string name="my_string"><b>Hello World!</b> This is an example.</string>

그러나, 확실하게, 당신은 단지 사용해야합니다 <b>, <i>그리고 <u>그들은 문서에 나열되어있다.

XML에서 HTML 문자열을 사용하려면 계속 사용 android:text="@string/..."하면 정상적으로 작동합니다.

유일한 차이점은 Java 코드에서 HTML 문자열 을 사용 하려면 전자가 스타일을 유지하고 후자는 스타일을 제거하므로 지금 getText(...)대신 사용해야 한다는 것입니다 getString(...).

그렇게 쉽습니다. CDATA도 없습니다 Html.fromHtml(...).

당신은해야합니다 Html.fromHtml(...)당신이 경우 HTML 태그에 인코딩하여 특수 문자를. getString(...)그때 와 함께 사용하십시오 . String을로 전달하려는 경우에 필요할 수 있습니다 String.format(...).

이것은 모두 문서에 설명 되어 있습니다.

편집하다:

getText(...)이스케이프 처리되지 않은 HTML (제안한대로) 또는 CDATA섹션과의 차이점은 없습니다 Html.fromHtml(...).

비교를 위해 다음 그래픽을 참조하십시오.

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


내 것이 벗겨져있다. 다음 코드를 사용하고 있습니다.getResources().getText(R.string.codename)
Si8

3
더 나은 도움을 얻으려면 Java / XML 발췌 부분을 봐야합니다. 그러나 내가 쓴 것처럼 : ,,을 사용 <b>하고 있는지 확실합니다 . 다른 태그는 항상 지원되지는 않습니다. <i><u>
caw

1
당신의 대답은 효과적이고 간단합니다. 문자열을 원하는 html 태그와 함께 strings.xml에 넣고 레이아웃 xml 파일에서 참조하십시오. <sup> 태그를 사용했습니다.
페리 하트만

1
귀하의 솔루션은 다른 솔루션과 달리 다른 솔루션과 달리 모든 태그를 지원하지 않기 때문에 다른 솔루션이 아닙니다. 다른 솔루션이 매우 간단한 경우이 솔루션에서 이점을 보지 못했습니다.
mobilepotato7 7

1
"CDATA"를 사용하여 경험 한 것처럼 문제가 있습니다. 예를 들어 22 자이고 HTML 부분이 10 개인 <! [CDATA [... HTML ...]]>은 10입니다. HTML.fromhtml ( getstring (...)) 텍스트는 올바르게 표시되지만 텍스트 내용에는 22 자 공백이 필요합니다. 나는 목록보기에서 사용하고 잡초 공간을 보았다. 따라서 gettext ()는 더 좋습니다.
David

16

HTML 태그를 피하십시오 ...

<resources>
    <string name="somestring">
        &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt;
        Content
    </string>
</resources>

이것이 문서에서 말하는 것입니다 : developer.android.com/intl/zh-TW/guide/topics/resources/…TextView HTML을 보여주기에 충분 합니까?
Macarse

3
나는 이것을 테스트했고, 당신이 자바 소스 코드에서 그것을 사용한다면 괜찮습니다. 그러나 텍스트를 레이아웃 XML에서 직접 연결하면 태그가 텍스트보기에 표시됩니다 (예 : <B> Title </ B> ...)
ZoltanF

도면에서 텍스트를 표시하기 위해, 클래스 [사용 developer.android.com/reference/android/text/Html.html]을 구체적 fromHTML().
ekawas

@ZoltanF가 맞습니다 .HTML이있는 레이아웃에서 android : text = ""를 사용하면 문자열에 태그가 표시됩니다.
Andrew Mackenzie

1
XML에서 직접 HTML 문자열을 사용하려면 문자열에 HTML 특수 문자를 인코딩 하지 않을 수 있습니다 . 당신이 코드에서 문자열을 사용하려는 경우,를 통해 Html.fromHTML()당신이 해야 할 특수 문자를 인코딩. 이상한!
caw

11

Android에는 리소스 문자열 유형 (예 : text / plain 또는 text / html)을 나타내는 사양이 없습니다. 그러나 개발자가 XML 파일 내에서이를 지정할 수있는 해결 방법이 있습니다.

  1. android : text 속성이 html임을 지정하도록 사용자 정의 속성을 정의하십시오.
  2. 서브 클래 싱 된 TextView를 사용하십시오.

이를 정의하면 setText (Html.fromHtml (...))를 다시 호출 할 필요없이 xml 파일로 HTML로 자신을 표현할 수 있습니다. 이 접근 방식이 API의 일부가 아니라는 사실에 놀랐습니다.

이 솔루션은 Android 스튜디오 시뮬레이터가 텍스트를 렌더링 된 HTML로 표시 할 정도로 작동합니다.

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

res / values ​​/ strings.xml (문자열 리소스는 HTML)

<resources>
<string name="app_name">TextViewEx</string>
<string name="string_with_html"><![CDATA[
       <em>Hello</em> <strong>World</strong>!
 ]]></string>
</resources>

layout.xml (관련 부분 만)

사용자 정의 속성 네임 스페이스를 선언하고 android_ex : isHtml 속성을 추가하십시오. 또한 TextView의 서브 클래스를 사용하십시오.

<RelativeLayout
...
xmlns:android_ex="http://schemas.android.com/apk/res-auto"
...>

<tv.twelvetone.samples.textviewex.TextViewEx
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/string_with_html"
    android_ex:isHtml="true"
    />
 </RelativeLayout>

res / values ​​/ attrs.xml (하위 클래스에 대한 사용자 정의 속성 정의)

 <resources>
<declare-styleable name="TextViewEx">
    <attr name="isHtml" format="boolean"/>
    <attr name="android:text" />
</declare-styleable>
</resources>

TextViewEx.java (TextView의 서브 클래스)

 package tv.twelvetone.samples.textviewex;

 import android.content.Context;
 import android.content.res.TypedArray;
 import android.support.annotation.Nullable;
 import android.text.Html;
 import android.util.AttributeSet;
 import android.widget.TextView;

public TextViewEx(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextViewEx, 0, 0);
    try {
        boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false);
        if (isHtml) {
            String text = a.getString(R.styleable.TextViewEx_android_text);
            if (text != null) {
                setText(Html.fromHtml(text));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        a.recycle();
    }
}
}

응용 프로그램이 모든 장소에서 HTML.fromHtml을 호출하는 대신 여러 장소에서 HTML 형식의 문자열을 사용하는 경우이 방법이 더 좋습니다. 앱 자체에는 일반 뷰와 HTML 뷰가 각각 하나씩 있습니다.
만주

10

최근 업데이트:

Html.fromHtml(string);// Android N 버전 이후 더 이상 사용되지 않습니다.

다음 코드는 안드로이드 N 이상 버전을 지원합니다 ...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(yourHtmlString,Html.FROM_HTML_MODE_LEGACY));
}

else 
{
textView.setText(Html.fromHtml(yourHtmlString));
}

3
  String termsOfCondition="<font color=#cc0029>Terms of Use </font>";
  String commma="<font color=#000000>, </font>";
  String privacyPolicy="<font color=#cc0029>Privacy Policy </font>";
  Spanned text=Html.fromHtml("I am of legal age and I have read, understood, agreed and accepted the "+termsOfCondition+commma+privacyPolicy);
        secondCheckBox.setText(text);

2

서버에서 문자열 HTML을받을 때 CDATA를 XML에 넣을 기회가없는 또 다른 경우가 있습니다.

다음은 서버에서 얻은 것입니다.

<p>The quick brown&nbsp;<br />
fox jumps&nbsp;<br />
 over the lazy dog<br />
</p>

더 복잡해 보이지만 솔루션이 훨씬 간단합니다.

private TextView textView;

protected void onCreate(Bundle savedInstanceState) { 
.....
textView = (TextView) findViewById(R.id.text); //need to define in your layout
String htmlFromServer = getHTMLContentFromAServer(); 
textView.setText(Html.fromHtml(htmlFromServer).toString());

}

그것이 도움이되기를 바랍니다!


4
여기서 getHTMLContentFromAServer의 구현 () 함수
팔라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.