답변:
update : 아래 @Andy에서 언급했듯이 Google은 HtmlCompat
아래 방법 대신 사용할 수있는 파일 을 만들었습니다 . 이 종속성 implementation 'androidx.core:core:1.0.1
을 앱의 build.gradle 파일에 추가하십시오. 최신 버전을 사용해야합니다 androidx.core:core
.
이를 통해 다음을 사용할 수 있습니다.
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
HtmlCompat-documentation 에서 다른 플래그에 대해 자세히 읽을 수 있습니다
원래 답변 :
Android N에서는 새로운 Html.fromHtml
방법 을 도입했습니다 . Html.fromHtml
이제 flags라는 추가 매개 변수가 필요합니다. 이 플래그를 사용하면 HTML이 표시되는 방법을보다 잘 제어 할 수 있습니다.
Android N 이상에서는이 새로운 방법을 사용해야합니다. 이전 방법은 더 이상 사용되지 않으며 향후 Android 버전에서 제거 될 수 있습니다.
이전 버전에서는 이전 방법을 사용하고 Android N 이상에서는 최신 방법을 사용하는 고유 한 Util-method를 만들 수 있습니다. 버전 확인을 추가하지 않으면 앱이 더 낮은 Android 버전에서 중단됩니다. 이 메소드는 Util 클래스에서 사용할 수 있습니다.
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
if(html == null){
// return an empty spannable if the html is null
return new SpannableString("");
}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
// we are using this flag to give a consistent behaviour
return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
} else {
return Html.fromHtml(html);
}
}
HTML.FROM_HTML_MODE_LEGACY
원하는 경우를 추가 매개 변수로 변환 할 수 있습니다 . 이를 통해 어떤 플래그를 사용할지 제어 할 수 있습니다.
Html 클래스 문서 에서 다른 플래그에 대한 자세한 내용을 읽을 수 있습니다
Html.FROM_HTML_MODE_LEGACY
//noinspection deprecation
바로 아래에 주석 을 추가하는 것도 유용합니다 else
.
나는 이러한 경고를 많이 받았으며 항상 FROM_HTML_MODE_LEGACY를 사용하므로 다음을 포함하는 HtmlCompat이라는 도우미 클래스를 만들었습니다.
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String source) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
} else {
return Html.fromHtml(source);
}
}
fromHtml ()의 플래그를 비교하십시오.
<p style="color: blue;">This is a paragraph with a style</p>
<h4>Heading H4</h4>
<ul>
<li style="color: yellow;">
<font color=\'#FF8000\'>li orange element</font>
</li>
<li>li #2 element</li>
</ul>
<blockquote>This is a blockquote</blockquote>
Text after blockquote
Text before div
<div>This is a div</div>
Text after div
또는 다음을 사용할 수 있습니다 androidx.core.text.HtmlCompat
.
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
Kotlin에서 개발하기에 운이 좋으면 확장 기능을 만드십시오.
fun String.toSpanned(): Spanned {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
@Suppress("DEPRECATION")
return Html.fromHtml(this)
}
}
그리고 어디에서나 사용하는 것이 너무 달콤합니다.
yourTextView.text = anyString.toSpanned()
Spanned
와return
이 메소드는 API 레벨 24 에서
더 이상 사용되지 않습니다.
FROM_HTML_MODE_LEGACY를 사용해야합니다
빈 줄 (두 줄 바꿈 문자)로 블록 수준 요소를 구분하십시오. 이것은 N 이전의 레거시 동작입니다.
암호
if (Build.VERSION.SDK_INT >= 24)
{
etOBJ.setText(Html.fromHtml("Intellij \n Amiyo",Html.FROM_HTML_MODE_LEGACY));
}
else
{
etOBJ.setText(Html.fromHtml("Intellij \n Amiyo"));
}
코 틀린
fun setTextHTML(html: String): Spanned
{
val result: Spanned = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(html)
}
return result
}
요구
txt_OBJ.text = setTextHTML("IIT Amiyo")
HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
공식 문서에서 :
fromHtml(String)
메소드는 API 레벨 24에서 사용되지 않습니다fromHtml(String, int)
. 대신 사용하십시오.
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
옵션toHtml(Spanned, int)
:'\n'
내부<p>
요소로 구분 된 연속 된 텍스트 줄을 줄 바꿈 합니다.
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
옵션에 대한toHtml(Spanned, int)
: 랩 텍스트의 각 라인으로 구분'\n'
, 안쪽<p>
또는<li>
요소입니다.
https://developer.android.com/reference/android/text/Html.html
당신이 사용하는 경우 코 틀린를 , 나는 코 틀린 확장자를 사용하여이를 달성 :
fun TextView.htmlText(text: String){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY))
} else {
setText(Html.fromHtml(text))
}
}
그런 다음 다음과 같이 호출하십시오.
textView.htmlText(yourHtmlText)
@Rockney 및 @ k2col의 답변을 확장하기 위해 개선 된 코드는 다음과 같습니다.
@NonNull
public static Spanned fromHtml(@NonNull String html) {
if (CompatUtils.isApiNonLowerThan(VERSION_CODES.N)) {
return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
} else {
//noinspection deprecation
return Html.fromHtml(html);
}
}
어디 CompatUtils.isApiNonLowerThan
:
public static boolean isApiNonLowerThan(int versionCode) {
return Build.VERSION.SDK_INT >= versionCode;
}
차이점은 추가 지역 변수가 없으며 지원 중단은 else
분기 에만 있다는 것입니다 . 따라서 이것은 단일 방법을 제외한 모든 방법을 억제하지 않습니다.
Google이 향후 버전의 Android에서 fromHtml(String source, int flags)
메소드 를 더 이상 사용하지 않기로 결정할 때 도움이 될 수 있습니다 .
당신이 사용할 수있는
//noinspection deprecation
return Html.fromHtml(source);
전체 문장이 아닌 단일 진술에 대한 검사를 억제합니다.
fromHtml()
줄 바꿈 처리 방법을 알려주는 플래그를 요구하도록 프레임 워크 클래스가 수정되었습니다 . 이것은 Nougat에 추가되었으며 Android 버전에서이 클래스의 비 호환성 문제에 대해서만 다룹니다.
클래스를 표준화하고 백 포트하고 요소 및 스타일에 대한 더 많은 콜백을 포함하기 위해 호환성 라이브러리를 게시했습니다.
프레임 워크의 Html 클래스와 유사하지만 더 많은 콜백을 허용하기 위해 일부 서명 변경이 필요했습니다. GitHub 페이지의 샘플은 다음과 같습니다.
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
// imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
minSdkVersion 15
와 targetSdkVersion 23
나는에 대한 빌드 오류 얻을 값-v24.xml : Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'.
분명히, 당신의 라이브러리를 대상으로 API 레벨 25. 그래도 어떻게 사용할 수 있습니까?
ul ol li 태그를 포함한 기본 html 태그를 지원하려면 다음을 시도하십시오. 아래와 같이 태그 핸들러를 작성하십시오.
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.Html.TagHandler;
import android.util.Log;
public class MyTagHandler implements TagHandler {
boolean first= true;
String parent=null;
int index=1;
@Override
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equals("ul")) parent="ul";
else if(tag.equals("ol")) parent="ol";
if(tag.equals("li")){
if(parent.equals("ul")){
if(first){
output.append("\n\t•");
first= false;
}else{
first = true;
}
}
else{
if(first){
output.append("\n\t"+index+". ");
first= false;
index++;
}else{
first = true;
}
}
}
}
}
아래와 같이 활동에 텍스트를 설정하십시오
@SuppressWarnings("deprecation")
public void init(){
try {
TextView help = (TextView) findViewById(R.id.help);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
help.setText(Html.fromHtml(getString(R.string.help_html),Html.FROM_HTML_MODE_LEGACY, null, new MyTagHandler()));
} else {
help.setText(Html.fromHtml(getString(R.string.help_html), null, new MyTagHandler()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
리소스 문자열 파일의 html 텍스트는
<! [CDATA [... raw html 데이터 ...]]>