Html.fromHtml은 Android N에서 더 이상 사용되지 않습니다.


300

Html.fromHtml에서 HTML을 보는 데 사용 하고 있습니다 TextView.

Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);

그러나 Html.fromHtml이제 Android N +에서 더 이상 사용되지 않습니다.

이 작업을 수행하는 새로운 방법을 어떻게 / 어떻게 찾습니까?

답변:


616

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 클래스 문서 에서 다른 플래그에 대한 자세한 내용을 읽을 수 있습니다


2
0은 어느 플래그를 나타 냅니까?
금지 지오 엔지니어링

4
Html.FROM_HTML_MODE_LEGACY
금지 지오 엔지니어링

14
아, HtmlCompat 같은 것이 나타날 때까지 기다리고
vanomart

12
보푸라기 경고를 피하기 위해 //noinspection deprecation바로 아래에 주석 을 추가하는 것도 유용합니다 else.
Ted Hopp

1
이 블로그 게시물에서 각 플래그의 기능을 확인할 수 있습니다. medium.com/@yair.kukielka/…
Yair Kukielka

95

나는 이러한 경고를 많이 받았으며 항상 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);
        }
    }

2
때문에 SuppressWarnings 주석의 동일 허용 대답과 같은 효과가 있지만, 한
Stoycho 안드리

이 모드에 대해 작은 설명을 해 줄 수 있습니까?
Ranjith Kumar

당신은 모든 HtmlCompact를 제공 할 수 있습니까? 멋진 허브처럼 보일 수 있습니다
shareef

@shareef 내가하고 싶지만 그것은 실제로이 단일 방법으로 지루한 유틸리티 클래스입니다 ....
k2col

61

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

FROM_HTML 플래그


입력 HTML도 공유 할 수 있습니까? 이것은 전환을 더 잘 이해하는 데 도움이됩니다.
Kalpesh Patel

스타일 속성이 구현되지 않았 음을 구현할 수 있습니까?
Christine


25

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

5
당신은 제거하여 typings을 절약 할 수 Spannedreturn
미나미에게

14

fromHtml

이 메소드는 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")

이 모드에 대해 작은 설명을 해 줄 수 있습니까?
Ranjith Kumar

SDK가 버전 확인을 처리하도록하려면 다음을 사용하십시오. HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
Wajid Ali

8

공식 문서에서 :

fromHtml(String)메소드는 API 레벨 24에서 사용되지 않습니다 fromHtml(String, int) . 대신 사용하십시오.

  1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVE옵션 toHtml(Spanned, int): '\n'내부 <p> 요소로 구분 된 연속 된 텍스트 줄을 줄 바꿈 합니다.

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUAL옵션에 대한 toHtml(Spanned, int): 랩 텍스트의 각 라인으로 구분 '\n', 안쪽 <p>또는 <li> 요소입니다.

https://developer.android.com/reference/android/text/Html.html


8

당신이 사용하는 경우 코 틀린를 , 나는 코 틀린 확장자를 사용하여이를 달성 :

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)

5

@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)메소드 를 더 이상 사용하지 않기로 결정할 때 도움이 될 수 있습니다 .


4

당신이 사용할 수있는

//noinspection deprecation
return Html.fromHtml(source);

전체 문장이 아닌 단일 진술에 대한 검사를 억제합니다.


2

fromHtml()줄 바꿈 처리 방법을 알려주는 플래그를 요구하도록 프레임 워크 클래스가 수정되었습니다 . 이것은 Nougat에 추가되었으며 Android 버전에서이 클래스의 비 호환성 문제에 대해서만 다룹니다.

클래스를 표준화하고 백 포트하고 요소 및 스타일에 대한 더 많은 콜백을 포함하기 위해 호환성 라이브러리를 게시했습니다.

https://github.com/Pixplicity/HtmlCompat

프레임 워크의 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);

I는 사용하는 응용 프로그램에 라이브러리를 사용하는 경우 minSdkVersion 15targetSdkVersion 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. 그래도 어떻게 사용할 수 있습니까?
JJD

2

여기 내 해결책이 있습니다.

 if (Build.VERSION.SDK_INT >= 24) {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage(), Html.FROM_HTML_MODE_LEGACY));
    } else {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage()));

    }

1

그냥 기능을 만드십시오 :

public Spanned fromHtml(String str){
  return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
}

-2

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 데이터 ...]]>

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