【问题标题】:Best view to display images and html content in android在android中显示图像和html内容的最佳视图
【发布时间】:2012-07-23 11:36:12
【问题描述】:

*我正在开发一个可以阅读电子邮件的应用程序。我正在使用 textview / edittext 来显示邮件。现在我可以将电子邮件内容作为字符串获取并显示出来。 但是哪个是显示带有 html 内容和图像的电子邮件的最佳视图? 请帮帮我。 谢谢 :) 编辑: 我按照 S.O. 的建议使用了 webview。朋友们(感谢@Andro Selva,@CFlex)。 但我面临一个问题,它显示了电子邮件的正文两次! :( 一次作为文本/纯文本,再次作为文本/html。 我尝试了以下代码来加载 webview。

webViewBody.loadData(details[3], "text/html", "UTF-8");
//webViewBody.loadDataWithBaseURL(null, details[3] , "text/html", "utf-8", null);

这里的 details[3] 是电子邮件的内容。 我在这里想念什么!? :(请帮帮我。

编辑: 我添加了用于获取消息内容的代码,用于在下面显示电子邮件内容。

    public void getContent(Message msg)
{
     try
     {
        Object o = msg.getContent();
            if (o instanceof String) 
        {
        if(((String) o).equalsIgnoreCase(""))
        {
        }
                    else
        {
           messageBody = (String)o+"STRING!!";
        }
       }
       else if (o instanceof Multipart) 
       {
        Multipart mp = (Multipart)o;
            int count3 = mp.getCount();
        for (int j = 0; j < count3-1; j++)
        {
            // Part are numbered starting at 0
            BodyPart b = mp.getBodyPart(j);
            Object o2 = b.getContent();
            if (o2 instanceof String) 
            {
                if(((String) o).equalsIgnoreCase(""))
                {
                }
                                    else
                {
                    messageBody = (String)o2+"MULTIPART!!"; 
                }
            }
        } //End of for
       }
       else if (o instanceof InputStream) 
       {
        //System.out.println("**This is an InputStream message**");
        InputStream is = (InputStream)o;
        // Assumes character content (not binary images)
                    //messageBody = convertStreamToString(is)+"INPUT STREAM!!";
            int c;
                    while ((c = is.read()) != -1) 
                    {
                    messageBody = convertToString(is)+"INPUT STREAM!!";
                System.out.println(messageBody);
                    }
       }
    }
        catch (Exception ex)
    {
    System.out.println("Exception arise at get Content");
    ex.printStackTrace();
    }

    //TODO TEST CODES
    try
    {
        String contentType = msg.getContentType();
        //          System.out.println("Content Type : " + contentType);
        Multipart mp = (Multipart) msg.getContent();
        int count = mp.getCount();
        for (int i = 0; i < count; i++)
        {
            dumpPart(mp.getBodyPart(i));
        }
    }
    catch (Exception ex)
    {
        System.out.println("Exception arise at get Content");
        ex.printStackTrace();
    }
}

public String convertToString(InputStream inputStream)
{
    StringBuffer string = new StringBuffer();
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    try 
    {
        while ((line = reader.readLine()) != null) 
        {
            string.append(line + "\n");
        }
    }
    catch (IOException e) 
    {
    }
    return string.toString();
}   

控件总是会进入“else if (o instanceof InputStream)”状态。所以它总是流式传输电子邮件并显示完整的电子邮件内容。我在这里错过了什么?

【问题讨论】:

  • 可能是网页视图?效果一样,但是比其他视图能更有效地管理html
  • 感谢您的回复 :) 我会尝试一下并返回这里。
  • 我已经更新了我的主要问题,请检查并帮助我。
  • 为什么使用了两种加载方式?你关注了哪一个?
  • 请调试并查看详细信息[3]。内容是否正常或重复?编辑了我的答案。

标签: java android android-layout android-webview


【解决方案1】:

我认为你需要实现一个WebView,因为它可以格式化html AND 显示图像。

AFAIK,带有 html 的 textView 可以格式化内容但不能显示图像。

编辑: 以下应该有效:

webViewBody.loadData(details[3], "text/html", null);

【讨论】:

  • 嘿,它显示的邮件很少,但是对于大多数带有图像和 html 内容的邮件,它给出错误说页面无法加载:(
  • 我已经更新了我的主要问题,请检查并帮助我。
【解决方案2】:

您可能会在同一封电子邮件中显示所有可以由 html 和纯文本内容组成的电子邮件内容。 这是因为这种电子邮件是多部分内容,您需要拆分它,您还需要分离附件和图像(嵌入) 查看您的“详细信息”是否没有返回多部分内容正文。

【讨论】:

  • 感谢您的回复。我猜你是对的!我无法拆分事物。我会用我用过的代码更新我的问题,请帮助我。
  • 嘿,我已经更新了我的问题,请看一下。该控件始终处于“else if (o instanceof InputStream)”状态。所以它总是流式传输电子邮件并显示完整的电子邮件内容。我在这里错过了什么?
  • 对不起@AdarshHs,我还在学习Android,我讲的是电子邮件格式的知识。您可以在收到时以“RAW”格式发布部分电子邮件内容吗?
【解决方案3】:

仅仅因为你写了两次,详细信息就会显示两次:

webViewBody.loadData(details[3], "text/html", "UTF-8");
webViewBody.loadDataWithBaseURL(null, details[3] , "text/html", "utf-8", null);

可能的解决方案:使用loadData()loadDataWithBaseURL()

【讨论】:

  • 感谢您的回复。哎呀!我一次只使用了其中一个,但结果都是一样的:(
  • 我会评论那一行以避免混淆。
【解决方案4】:

添加这些行解决了问题!

    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc);

感谢所有帮助我解决此问题的人。 :)

【讨论】:

  • 不错!在此之后你如何选择要显示的内容?
  • 添加这些行后,控件将转到相应的 if 循环。检查我发布的代码。如果实例是字符串等类型,则可以轻松处理。
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多