XML의 html 형식 문자열 리소스에서 TextView 텍스트
내 안에 고정된 끈이 몇 개 있습니다.strings.xml다음과 같은 것:
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
그리고 내 레이아웃에 나는 있습니다.TextViewhtml 형자로채싶우습니다고로 채우고
<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>
만약내이한다면, 이.formattedtext 의내일뿐다입의 입니다.somestringHTML 태그가 제거되어 포맷되지 않았습니다.
포맷된 텍스트를 프로그래밍 방식으로 설정할 수 있음을 알고 있습니다.
.setText(Html.fromHtml(somestring));
왜냐하면 나는 이것을 내 프로그램의 다른 부분에서 예상대로 작동하기 때문입니다.
하려면 이기을호면려하가 합니다.Activity 제 로 된 이며, "XML 하고 Activity텍스트를 설정하기 위해.
제가 뭔가 명백한 것을 간과하고 있나요?그것은 전혀 불가능합니까?도움이나 해결 방법이 있으면 언제든지 환영합니다!
편집: 몇 가지 시도해 본 결과 xml의 HTML 형식에는 몇 가지 제약이 있는 것 같습니다.
태그는 소문자로 작성해야 합니다.
여기에 언급된 일부 태그는 작동하지 않습니다.
<br/>\n대신)
누군가 이것을 발견할 경우를 대비하여 문서화되지 않은 더 좋은 대안이 있습니다(몇 시간 동안 검색한 후에 걸려 넘어졌고 마침내 Android SDK 자체의 버그 목록에서 찾았습니다).raw HTML을 strings.xml에 포함할 수 있습니다.
<![CDATA[ ...raw html... ]]>
가장자리 케이스:
- 아포스트로피('), 이중 따옴표(") 및 앰퍼샌드(&)와 같은 문자는 렌더링된 텍스트에 그대로 표시하려는 경우에만 이스케이프하면 되지만 HTML로 해석할 수 있습니다.
'그리고."현 할 수 있 으로 표현할 수 .\'그리고.\"또는'그리고.".<그리고.>항상 탈출할 필요가 있습니다.<그리고.>문자 그대로 텍스트에서 '<' 및 '>'로 렌더링하기를 원하는 경우.- 앰퍼샌드(&)는 조금 더 복잡합니다.
- 앰퍼샌드 뒤에 공백이 있으면 앰퍼샌드로 렌더링됩니다.
- 올바른 HTML 엔터티 코드를 형성하지 않는 하나 이상의 문자 뒤에 앰퍼샌드가 표시되고 그 뒤에 앰퍼샌드가 표시됩니다.그래서...
&qqq;를 렌링더됨으로 렌더링합니다.&qqq;,그렇지만<1를 렌링더됨으로 렌더링합니다.<1.
예:
<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 from the same \'string\'.</p>
<p>To be clear, 0 < 1, & 10 > 1<p>
]]>
</string>
코드에서 다음을 수행합니다.
TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html), FROM_HTML_MODE_LEGACY));
IMHO, 이것은 함께 일하기에 몇 배 더 좋습니다 :-)
2021년 8월 업데이트:저의 원래 답변은 Html.fromHtml(String)을 사용했는데, API 24에서 더 이상 사용되지 않습니다.Html(String,int) 양식의 대안이 대체품으로 제안됩니다.
FROM_HTML_MODE_LEGACY가 작동할 것 같습니다...하지만 다른 깃발들 중 하나가 당신이 하고 싶은 일에 더 나은 선택일 수도 있습니다.
마지막으로 HTML 대신 Markdown 구문을 사용하여 Android Spaned 텍스트를 TextView에서 사용하기에 적합하게 렌더링하려면 https://noties.io/Markwon 을 포함하여 여러 타사 라이브러리가 있습니다.
여기서 가장 중요한 답변은 잘못된 것을 제안하는 것이기 때문에(또는 적어도 너무 복잡함), 질문이 꽤 오래된 것이기는 하지만, 이것을 업데이트해야 한다고 생각합니다.
Android에서 String 리소스를 사용할 때, 당신은 단지 전화하기만 하면 됩니다.getString(...)에서 또는 코드사서에를 사용합니다.android:text="@string/..."XML .
문자열에 HTML 마크업을 사용하고 싶어도 많이 변경할 필요가 없습니다.
문자열 리소스에서 이스케이프해야 하는 문자는 다음과 같습니다.
- 큰옴표따:
"되다\" - 단일따표옴:
'되다\' - 앰샌드퍼:
&되다&또는&
즉, 태그를 벗어나지 않고 HTML 마크업을 추가할 수 있습니다.
<string name="my_string"><b>Hello World!</b> This is an example.</string>
그러나 확실하게 하기 위해서는 다음을 사용해야 합니다.<b>,<i>그리고.<u>설명서에 나와 있는 대로입니다.
XML의 HTML 문자열을 사용하려면 계속 사용하십시오.android:text="@string/..."잘 될 겁니다.
유일한 차이점은, 만약 당신이 자바 코드의 HTML 문자열을 사용하고 싶다면, 당신은 다음을 사용해야 한다는 것입니다.getText(...)에 getString(...)이제, 전자가 스타일을 유지하고 후자가 그것을 벗길 것이기 때문입니다.
그것은 그것만큼 쉽습니다. CDATA 없음 없음, 음Html.fromHtml(...).
필요한 것은 다음과 같습니다.Html.fromHtml(...)HTML 마크업으로 특수 문자를 인코딩한 경우.함께 사용getString(...)다음으로 문자열을 전달하려면 이 작업이 필요합니다.String.format(...).
편집:
사이에 차이는 없습니다.getText(...)하지 않은 HTML제안한 ) HTML(HTML)로CDATA 및 션및Html.fromHtml(...).
비교는 다음 그림을 참조하십시오.

HTML 태그를 이스케이프
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
Android에는 리소스 문자열 유형(예: 텍스트/일반 또는 텍스트/html)을 나타내는 사양이 없습니다.그러나 개발자가 XML 파일 내에서 이를 지정할 수 있는 해결 방법이 있습니다.
- 사용자 지정 특성을 정의하여 Android:text 특성이 html임을 지정합니다.
- 하위 분류 텍스트 보기를 사용합니다.
이를 정의하면 setText(Html.fromHtml(...))를 다시 호출할 필요 없이 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(string);//Android N 버전 이후에는 사용되지 않습니다.
Android 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));
}
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);
서버에서 HTML 문자열을 받아서 xml에 CDATA를 넣을 기회가 없는 경우가 또 있습니다.
서버에서 얻을 수 있는 것은 다음과 같습니다.
<p>The quick brown <br />
fox jumps <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());
}
도움이 되길 바랍니다!
Android 앱에서 TextView처럼 html 스크립트를 표시하려면
이 코드를 따르십시오.
Kotlin
var stringvalue = "Your Sting"
yourTextVew.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(stringvalue, Html.FROM_HTML_MODE_COMPACT)
} else {
Html.fromHtml(stringvalue)
}
Java
String stringvalue = "Your String";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
yourTextVew.setText(Html.fromHtml(stringvalue, Html.FROM_HTML_MODE_COMPACT))
} else {
yourTextVew.setText( Html.fromHtml(stringvalue))
}
언급URL : https://stackoverflow.com/questions/3235131/set-textview-text-from-html-formatted-string-resource-in-xml
'source' 카테고리의 다른 글
| {{object} 여부를 확인하지 않으면 오류가 발생합니다.필드}이(가) 존재합니다. (0) | 2023.08.28 |
|---|---|
| web.config 파일에서 리디렉션 설정 (0) | 2023.08.28 |
| SQL Server의 Excel 저장 프로시저의 표와 워크북의 매개 변수 필드 (0) | 2023.08.28 |
| Django가 Docker를 사용하여 MariaDB 인스턴스에 연결할 수 없습니다. (0) | 2023.08.28 |
| Get-Aduser - 필터가 변수를 허용하지 않습니다. (0) | 2023.08.28 |
