Android N中不推荐使用Html.fromHtml
我正在使用Android N中不推荐使用Html.fromHtml,android,deprecated,android-7.0-nougat,Android,Deprecated,Android 7.0 Nougat,我正在使用Html.fromHtml在TextView中查看Html Spanned result = Html.fromHtml(mNews.getTitle()); ... ... mNewsTitle.setText(result); 但是,Html.fromHtml现在在Android N中被弃用+ 我如何找到这种新的方法?来自官方文件: fromHtml(String)方法在API级别24中被弃用。使用fromHtml(字符串,int) 相反 TO\u HTML\u段落\u行用于to
Html.fromHtml
在TextView
中查看Html
Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);
但是,Html.fromHtml
现在在Android N中被弃用+
我如何找到这种新的方法?来自官方文件:
fromHtml(String)
方法在API级别24中被弃用。使用fromHtml(字符串,int)
相反
TO\u HTML\u段落\u行
用于toHtml(span,int)
的连续选项:在
元素
到HTML\u段落行\u单个选项到HTML(span,int)
:将由'\n'
分隔的每行文本包装在
或
元素
更新:
因为谷歌已经创建了HtmlCompat
,可以用它来代替下面的方法。添加此依赖项实现'androidx.core:core:1.0.1
转到应用程序的build.gradle文件。确保使用最新版本的androidx.core:core
这允许您使用:
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
您可以阅读更多关于屏幕上不同标志的信息
原始答案:
在安卓N中,他们引入了一种新的Html.fromHtml
方法Html.fromHtml
现在需要一个名为flags的附加参数。此标志使您能够更好地控制HTML的显示方式
在安卓N和更高版本上,您应该使用这种新方法。旧方法已被弃用,可能会在未来的Android版本中删除
您可以创建自己的Util方法,该方法将在旧版本上使用旧方法,在Android N及更高版本上使用新方法。如果您不添加版本检查,您的应用程序将在较低的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
转换为附加参数。这使您可以更多地控制使用哪个标志
您可以阅读更多关于屏幕上不同标志的信息
我有很多这样的警告,我总是使用FROM\u HTML\u MODE\u 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()的标志
这是一个带有样式的段落
品目H4
-
锂橙元素
- li#2元素
这是一个区块报价
块引号后的文本
div之前的文本
这是一个div
div后面的文本
该方法在API 24级中被弃用
您应该使用
使用空行(两个换行符)分隔块级元素
字符)介于两者之间。这是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"));
}
对于Kotlin
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
}
召唤
你可以用
//noinspection deprecation
return Html.fromHtml(source);
为了仅对单个语句而不是整个方法抑制检查。为了扩展@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);
}
}
其中compatitils.isApiNonLowerThan
:
public static boolean isApiNonLowerThan(int versionCode) {
return Build.VERSION.SDK_INT >= versionCode;
}
不同之处在于,没有额外的局部变量,并且只在else
分支中进行了弃用。因此,这不会抑制所有方法,而是抑制单个分支
当谷歌决定在未来的Android版本中甚至废除fromHtml(字符串源代码,int标志)
方法时,它会有所帮助。框架类已经修改,需要一个标志来通知fromHtml()
如何处理换行符。这是在牛轧糖中添加的,只涉及到这个类在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);
尝试以下操作以支持基本html标记,包括ul-ol-li标记。
创建一个标记处理程序,如下所示
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();
}
}
按如下所示设置“活动”上的文本
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文本
如果你有幸在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()
或者您可以使用androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
HtmlCompat.fromHtml(“HTML”,HtmlCompat.FROM\u HTML\u MODE\u LEGACY)
如果您使用的是Kotlin,我通过使用Kotlin扩展实现了这一点:
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)
这是我的解决办法
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);
}
零代表哪个标志?Html。从\u Html\u MODE\u LEGACY
ah,等待HtmlCompat之类的东西出现也很有用,可以在else
下添加//noinspection deprecation
注释,以避免出现lint警告。你可以在这篇博文中看到这些标志的作用:与接受的答案效果相同,但是+1因为SuppressWarnings注释,您能对此模式给出一个小的解释吗?您能提供所有HtmlCompact可能都在git hub上吗cool@shareef我会的,但这真的只是一个无聊的实用类,里面只有一个方法……你能不能也分享一下输入HTML?这将有助于更好地理解转换。我看到样式属性没有实现,有没有实现它们的方法?能否对此模式给出一些解释?如果希望SDK处理版本检查,请使用:HtmlCompat.fromHtml(“textWithHtmlTags”),HtmlCompat.FROM_HTML_MODE_LEGACY)
当我在使用minSdkVersion 15
和targetSdkVersion 23
的应用程序上使用你的库时,我得到values-v24.xml的生成错误:错误:(3)