Android-使用fromHtml()在TextView中显示内容时出错



基本上,目标是在请求JSON的活动中显示Wordpress‘Post。首先我做请求,然后用变量填充对象内部的结果。然后我从对象中获取这些变量,以显示在视图中的字段中。

这就是我提出请求的方式:

private void parseJsonFeed(JSONObject response)
{
JSONObject feedObj;
try
{
if (response.length() != 0)
{
feedObj = response;
JSONObject cO = feedObj.getJSONObject("terms").getJSONArray("category").getJSONObject(0);
Category c = new Category(escapeNull(cO.getString("name"), true), cO.getInt("ID"));
itemPost.setID(feedObj.getInt("ID"));
itemPost.setTitulo(escapeNull(feedObj.getString("title"), true));
if (!feedObj.isNull("featured_image"))
itemPost.setImgUrl(escapeNull(feedObj.getJSONObject("featured_image").getString("source"), false));
else
itemPost.setImgUrl(null);
itemPost.setData(ajustData(escapeNull(feedObj.getString("date"), false)));
itemPost.setPostUrl(escapeNull(feedObj.getString("link"), false));
itemPost.setCategoria(c);
itemPost.setAuthor(escapeNull(feedObj.getJSONObject("author").getString("name"), false));
itemPost.setConteudo(feedObj.getString("content"));
loadLayout();
}
}
catch (JSONException e)
{ e.printStackTrace(); }
}

详细信息feedObj.getString("content")是一个包含以下HTML代码的字符串:

<p>Recentemente saiu uma lista com os possíveis candidatos para interpretar o novo <strong>Homem-Aranha</strong> no novo <strong>Universo Cinematográfico da Marvel</strong>. Saiba agora qual deles merece o papel e quem realmente devia encarar o <strong>Homem-Aranha</strong>!</p>
<p>Esqueça <strong>Dylan O&#8217;Brien</strong>, esqueça <strong>Logan Lerman</strong>, esqueça qualquer um com mais de 20 anos. A <strong>Marvel</strong> quer um<strong> Homem-Aranha</strong> mais colegial, que tenha entre 15~16 anos<em> &#8211; pelo menos visualmente falando</em>. Por este motivo, teremos apenas jovens atores cotados para o papel!</p>
<p>Recentemente, uma lista com possíveis candidatos foi lançada e já é possível especular quem merece entrar na pela do Homem-Aranha e participar de todo universo de filmes que será criado entre a Marvel e a <strong>Sony</strong>. Aliás, já falamos, o quanto isso é bom para a Marvel <em><a href="http://osupernerd.com.br/cinema/como-o-novo-homem-aranha-vai-ajudar-a-marvel/">- veja aqui</a>!</em></p>
<h2>O perfil do Homem-Aranha</h2>
<a href="http://osupernerd.com.br/wp-content/uploads/2015/03/Homem-Aranha.jpg"><img src="http://osupernerd.com.br/wp-content/uploads/2015/03/Homem-Aranha-1024x576.jpg"/></a><p>A única coisa que preciso é ver esse uniforme novamente nos cinemas.</p>
<p><strong>O Espetacular Homem-Aranha 2</strong> não foi lá aquelas coisas, mas algo que você não pode negar é que o Homem-Aranha foi bem representado. Um Homem-Aranha brincalhão, dá <em>&#8220;zoeira&#8221;</em>. É certamente o Homem-Aranha que precisamos nos cinemas.</p>
<p>Por outro lado, o <strong>Peter</strong> de <strong>Andrew Garfield</strong> foi um dramático romântico e, por vezes, descolado até demais. Ele, digamos, estava um pouco <em>hipster</em> demais, o que foge do Peter que conhecemos. Nesse caso, eu preferiria o Peter desajeitado de <strong>Tobey Maguire</strong> e o Homem-Aranha descolado de Andrew Garfield.</p>
<p>Como o <strong>Universo Marvel</strong> nos cinemas é cheio de alívios cômicos, é muito provável que essa seja a linha com que eles trabalhem. Então teremos um adolescente desajeitado que faz de tudo para se encaixar na escola, é bem inteligente e acha super <em>&#8220;irado&#8221;</em> estar com os <strong>Vingadores</strong>. O Homem-Aranha da <em>&#8220;zoeira&#8221;</em> também está dentro de Peter!</p>
<p>Assim, o mais importante é encontrar um ator que consiga fazer esse equilíbrio. Não seja chato demais, não seja dramático demais, que seja apenas um adolescente inteligente que acha super-heróis mais do que maneiro.</p>
<h2>#1 Timothee Chalamet</h2>
<a href="http://osupernerd.com.br/wp-content/uploads/2015/04/timothee-chalamet.jpg"><img src="http://osupernerd.com.br/wp-content/uploads/2015/04/timothee-chalamet.jpg"/></a><p>Tem uma cara de rebelde, mas dependendo da atuação quem sabe pode ser um bom Peter.</p>
<p><strong>Timothee Chalamet</strong> ainda não apareceu muito. Podemos dizer que você vai conhecê-lo por <strong>Interstelar</strong>, representando <strong>Tom</strong>, com 15 anos, filho de <strong>Cooper</strong>. Sinceramente, ele não tem tanto destaque, parece ser perfeito para representar um adolescente rebelde.</p>
<p>Ele já deu um ponta como estudante em <strong>Homeland</strong>, apesar do personagem ser outro. Você não consegue olhar para ele e ver o <strong>Peter Parker</strong> desajeitado que conhecemos e adoramos, tanto nos quadrinhos quanto em algumas animações.</p>
<h2>#2 Nat Wolff</h2>
<a href="http://osupernerd.com.br/wp-content/uploads/2015/04/nat-wolff.jpg"><img src="http://osupernerd.com.br/wp-content/uploads/2015/04/nat-wolff.jpg"/></a><p>Não se encaixa muito com o personagem, pelo menos na idade visual que eles procuram.</p>
<p><strong>Nat Wolff</strong> popularizou em <strong>A Culpa é das Estrelas</strong>, como <strong>Isaac</strong>, amigo de <strong>Gus</strong>. Está ai um ator que não tem nada haver com Peter, e já aparenta ser mais velho. Entretanto, <strong>Vincent D&#8217;Onofrio</strong> <em>- o Rei do Crime, em Demolidor -</em> está fazendo uma baita de uma campanha para Marvel chamar Nat para ser Peter. Quer contrária-lo?</p>
<p>Uma prova de que essa lista pode ser apenas uma especulação é que ontem, 24 de abril, <a href="http://comicbook.com/2015/04/24/nat-wolff-talks-spider-man-rumors/">Nat foi questionado pela <strong>MTV</strong></a> sobre ser o candidato para Homem-Aranha, e ele respondeu: <em>&#8220;Honestamente, eu não sei nada sobre Homem-Aranha&#8221;</em>. Talvez foi um desvio de atenção, ou será que ele realmente não é um candidato?!</p>
<h2>#3 Liam James</h2>
<a href="http://osupernerd.com.br/wp-content/uploads/2015/04/liam-james.jpg"><img src="http://osupernerd.com.br/wp-content/uploads/2015/04/liam-james.jpg"/></a><p>É a cara do Peter Parker estilo Disney.</p>
<p><strong>Liam James</strong> há tempos que não dá as caras nos cinemas. Seu último filme foi <strong>O Verão da Minha Vida</strong>, em 2013. A única coisa que tenho para dizer é que ele tem um baita de um potencial e ele é a cara da <strong>Disney</strong>, só isso já é mais do que suficiente. Quanto sua atuação para Peter, só depende de seu teste.</p>
<h2>#4 Tom Holland</h2>
<a href="http://osupernerd.com.br/wp-content/uploads/2015/04/tom-holland.jpg"><img src="http://osupernerd.com.br/wp-content/uploads/2015/04/tom-holland.jpg"/></a><p>Sinto que ele será a última opção da Marvel entre todos.</p>
<p>Sua primeira grande aparição foi em <strong>O Impossível</strong>, depois disso não ganhou tanto destaque. Ele não fez tantos papeis também, é difícil julgá-lo. Mas eu sinto que, para a Marvel, ele seria a última opção dentre todos.</p>
<h2>#5 Asa Butterfield</h2>
<a href="http://osupernerd.com.br/wp-content/uploads/2015/04/asa-butterfield.jpg"><img src="http://osupernerd.com.br/wp-content/uploads/2015/04/asa-butterfield.jpg"/></a><p>Asa Butterfield tem cara de Peter Parker inteligente.</p>
<p>O <strong>Asa Butterfield</strong>, com certeza, é o que mais todos ouviram falar. Ele está em <strong>Ender&#8217;s Game: O Jogo do Exterminador</strong>, <strong>A Invenção de Hugo Cabret</strong> e <strong>O Menino do Pijama Listrado</strong>. O garoto <em>- que já tem 18 anos -</em> é um grande ator. Ele transparece o Peter inteligente, mas será que ele seria bom o suficiente para o Homem-Aranha?</p>
<p>Grande parte dos papeis de Asa tem uma grande carga dramática, ele precisa se desafiar muito para se soltar e fazer um Peter empolgado com os Vingadores. Não consigo ver ele como o cara das piadinhas, entende?</p>
<h2>Quem deve ser o Homem-Aranha?</h2>
<p>Se fosse escolher pelo mais conhecido, escolheria o Asa, sem dúvidas. Como eu disso ele é um grande ator, saberia fazer o que fosse preciso. Ele seria o <strong>nerd</strong> e inteligente Parker, talvez até demais. Nesse ponto, Asa está mais para <strong>Sheldon</strong> <em>- The Big Bang Theory -</em> do que para Peter.</p>
<p>O grande problema é que ele se tornou<em> &#8220;especialista&#8221;</em> em drama, e em personagens com uma grande carga nas costas. Se ele consegue ser o Homem-Aranha da zoeira e o Peter Parker nerd<em> &#8211; sem dramas -</em> só o teste dele dirá. Esse é um dos aspectos que faz com que ao mesmo tempo que torço para o Asa, também não torço.</p>
<p>Por outro lado, Liam James é a cara da Disney, reparou?! É um dos que não mostrou ainda no que é bom, mas provou que pode ser bom. Também é um dos que menos apareceu, junto com <strong>Tom Holland</strong>. Se a Marvel, procura por alguém que não é tão concorrido para realizar contrato por longos anos, Liam é o cara.</p> 
<h2>E, sinceramente, quero Asa, por popularidade, mas aposto em Liam! E você?</h2>

如何查看Html代码中没有错误

好吧,在提出请求后,我调用loadLayout()来填充视图中的字段:

private void loadLayout()
{
TextView title = (TextView) findViewById(R.id.title_post);
TextView date = (TextView) findViewById(R.id.date_post);
TextView category = (TextView) findViewById(R.id.category_post);
TextView author = (TextView) findViewById(R.id.author_post);
TextView conteudo = (TextView) findViewById(R.id.content_post);
title.setText(itemPost.getTitulo());
date.setText(itemPost.getData());
category.setText(itemPost.getCategoria().getNome());
author.setText(itemPost.getAuthor());
conteudo.setText(Html.fromHtml(itemPost.getConteudo()));
}

问题是…conteudo.setText(Html.fromHtml(itemPost.getConteudo()))行总是返回一个错误,如您所见:

04-25 21:11:43.715    6611-6611/br.com.osupernerd.osupernerd E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.ArrayIndexOutOfBoundsException: length=500; index=4057
at android.text.MeasuredText.addStyleRun(MeasuredText.java:168)
at android.text.MeasuredText.addStyleRun(MeasuredText.java:204)
at android.text.StaticLayout.generate(StaticLayout.java:281)
at android.text.StaticLayout.<init>(StaticLayout.java:140)
at android.text.StaticLayout.<init>(StaticLayout.java:80)
at android.text.StaticLayout.<init>(StaticLayout.java:59)
at android.widget.TextView.makeSingleLayout(TextView.java:5901)
at android.widget.TextView.makeNewLayout(TextView.java:5741)
at android.widget.TextView.onMeasure(TextView.java:6098)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1196)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.widget.ScrollView.onMeasure(ScrollView.java:318)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1038)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:576)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15172)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
at android.view.View.measure(View.java:15172)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.

我不知道我能做什么…为了测试,我取了itemPost.getConteudo()的字符串,然后手动将其放入Html.fromHtml(),如下所示:

conteudo.setText(Html.fromHtml("<p>Recentemente saiu uma lista com os possíveis candidatos para interpretar o novo <strong>Homem-Aranha</strong> no novo <strong>Universo Cinematográfico da Marvel</strong>. Saiba agora qual deles merece o papel e quem realmente devia encarar o <strong>Homem-Aranha</strong>!</p>**... I placed all HTML code here**"));

然后,我又跑了,而且跑得很好。因此,对我来说,这意味着HTML代码是正确的,但字符串itemPost.getConteudo()可能出了问题。请有人帮我了解出了什么问题!?

我发现了问题!在TextView上设置文本时,JellyBean上有一个错误Span。当文本的非跨区部分换行错误时,就会发生这种情况。所以,我只是创建了一个简单的方法来解决它:

private String ajustHtml (String s)
{
// Make a line-wrap space before all HTML tags
s = s.replace("<", " <");
// Remove duplicated space
s = s.replace("  ", " ");
return s;
}

我这样使用它:itemPost.setConteudo(ajustHtml(feedObj.getString("content"))

Everthing运行良好!:)

最新更新