简体   繁体   中英

Android - Getting error when using fromHtml() to show content in a TextView

Basically the objective is show a Wordpress' Post in a Activity requesting JSON. First I do the request, later I fill the results inside a object with variables. Then I get this variables from the object to show in the fields on view.

This is how I make a request:

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

}

Details The feedObj.getString("content") is a string that contains the following HTML code:

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

How you can see there are no error in Html Code

Well, after made a request I call loadLayout() that fill fields in the View:

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

The problem is... in the line conteudo.setText(Html.fromHtml(itemPost.getConteudo())) is always returning an error, as you can see:

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.

I don't know what I can do... To test, I took the string of itemPost.getConteudo() and I placed, manually, in Html.fromHtml() , like this:

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**"));

Then, I ran again, and worked well. So for me, it means that HTML code is right, but something is going wrong, maybe, with the string itemPost.getConteudo(). Someone, please, can help me understand what's going wrong!?

I found the problem! There is a bug Span on JellyBean, when setting text on TextView. It happens when have a wrong line-wrap in the non-spanned part of the text. So, I just created a simple method to solve it:

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;
}

And I use it like this: itemPost.setConteudo(ajustHtml(feedObj.getString("content")));

Everthing worked fine! :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM