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
또는 사용할 수 있습니다.androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
코틀린에서 개발할 수 있는 운이 좋다면, 그냥 확장 기능을 만들어 보세요:
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()
이 방법은 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)
대신.
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
@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 버전 간에 이 클래스의 비호환성 문제에 대해서만 언급합니다.
클래스를 표준화 및 백포트하고 요소 및 스타일에 대한 콜백을 추가하기 위해 호환성 라이브러리를 게시했습니다.
프레임워크의 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
'programing' 카테고리의 다른 글
Wi-Fi가 안드로이드에 연결되어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.08.10 |
---|---|
'게시에 실패했습니다.' 그러나 빌드에 성공했습니까? (0) | 2023.08.10 |
executeUpdate를 사용하는 SELECT 쿼리 동작 (0) | 2023.08.10 |
자바스크립트 코드를 통해 확인해도 체크박스 클릭 이벤트를 트리거하는 방법은? (0) | 2023.08.10 |
'org. spring framework' 유형의 콩.security.oauth2.client.registration.'클라이언트 등록 리포지토리'를 찾을 수 없습니다. - Spring Security (0) | 2023.08.10 |