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

时间:2015-04-26 01:18:22

标签: android html json textview

基本上,目标是显示Wordpress'在请求JSON的活动中发布。首先我执行请求,稍后我将结果填入带有变量的对象中。然后我从对象中获取这些变量,以便在视图中的字段中显示。

这是我提出请求的方式:

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()可能会出错。请某人帮我理解出了什么问题!?

1 个答案:

答案 0 :(得分:0)

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

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工作得很好! :)