Programing

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

lottogame 2020. 4. 1. 07:58
반응형

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


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

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

하지만 Html.fromHtml이제는 Android N +에서 더 이상 사용되지 않습니다.

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


업데이트 : @Andy 구글이 만든 언급 한 바와 같이 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 클래스 문서 에서 다른 플래그에 대한 자세한 내용을 읽을 수 있습니다


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

FROM_HTML 플래그


또는 다음을 사용할 수 있습니다 androidx.core.text.HtmlCompat.

HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)

HTMLCompat 문서


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

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

공식 문서에서 :

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


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


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

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)

당신이 사용할 수있는

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

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


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

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

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

    }

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

참고 URL : https://stackoverflow.com/questions/37904739/html-fromhtml-deprecated-in-android-n

반응형