programing

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

codeshow 2023. 8. 10. 21:46
반응형

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

는 사용중을 하고 있습니다.Html.fromHtml을 html로 TextView.

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

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

새로운 방법을 찾으려면 어떻게 해야 합니까?

업데이트: 아래에 언급된 @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이제 플래그라는 추가 매개 변수가 필요합니다.이 플래그를 사용하면 HTML이 표시되는 방식을 보다 잘 제어할 수 있습니다.

Android N 이상에서는 이 새로운 방법을 사용해야 합니다.이전 방법은 더 이상 사용되지 않으며 향후 Android 버전에서 제거될 수 있습니다.

이전 버전에서는 이전 방법을 사용하고 Android N 이상에서는 최신 방법을 사용하는 자신만의 Util-method를 만들 수 있습니다.버전을 추가하지 않으면 안드로이드 버전이 낮은 경우 앱이 중단됩니다.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 FLAGS

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

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

HtmlCompat 문서

코틀린에서 개발할 수 있는 운이 좋다면, 그냥 확장 기능을 만들어 보세요:

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

Html에서

이 방법은 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")

코틀린을 사용하는 경우 코틀린 확장자를 사용하여 이를 달성했습니다.

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)

공식 문서에서:

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분점.따라서 이것은 단일 분기를 제외한 모든 메서드를 억제하지 않습니다.

그것은 구글이 안드로이드의 미래 버전에서 심지어 더 이상 사용하지 않기로 결정할 때 도움이 될 수 있습니다.fromHtml(String source, int flags)방법.

사용할 수 있습니다.

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

전체 방법이 아닌 단일 문에 대해서만 검사를 억제합니다.

Kotlin 사용자의 경우, 우리는 다음을 사용할 수 있습니다.String.parseAsHtml()호환성 검사를 수행하는 HtmlCompat을 사용하는 확장 함수입니다.

이것은 다음에서 이용 가능한 안드로이드 코어 코틀린 확장에서 이용할 수 있습니다.androidx.core:core-ktx

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

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

    }

그냥 함수를 만듭니다.

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

프레임워크 클래스가 수정되어 이를 알리기 위해 플래그가 필요합니다.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);

ulolli 태그를 포함한 기본 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[ ...원시 html 데이터...]] >

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

반응형