Android показывает и редактирует HTML

#java #android #html #android-layout

#java #Android #HTML #android-макет

Вопрос:

Я работаю над почтовым клиентом, и мне нужно отобразить электронное письмо в формате HTML и отредактировать его в каком-то EditText виде.

Я загружаю электронную почту в формате HTML и показываю ее в WebView — все в порядке. Но когда я хочу ответить на это электронное письмо или отредактировать свою подпись, которая находится в HTML, мне нужно отобразить ее в каком-то EditText виде, который может отображать ее должным образом и редактировать.. Какой-то WYSIWYG..

Есть ли какое-либо решение? Спасибо

Я что-то упускаю?

Редактировать:
Итак, я попытался использовать ImageGetter следующим образом:

 mEmailEditText.setText(Html.fromHtml(mArgumentEmail.getmHtmlMessage(), getImageHTML(), null));

private Html.ImageGetter getImageHTML() {
    Html.ImageGetter imageGetter = new Html.ImageGetter() {
        public Drawable getDrawable(String source) {
            try {
                Drawable drawable = Drawable.createFromStream(new URL(source).openStream(), "src name");
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                return drawable;
            } catch(IOException exception) {
                Log.v("IOException", exception.getMessage());
                return null;
            }
        }
    };
    return imageGetter;
}
  

Но это не сработало.. «К сожалению, электронная почта прекратилась». в строке mEmailEditText.setText..

  Caused by: android.os.NetworkOnMainThreadException ....
  

РЕДАКТИРОВАТЬ2:
Итак, мой окончательный рабочий результат выглядит следующим образом:

  public Html.ImageGetter getImageHTML() {
    Html.ImageGetter imageGetter = new Html.ImageGetter() {
        public Drawable getDrawable(String source) {
            DownloadImageTask task = new DownloadImageTask();
            try {
                return task.execute(new String[] { source }).get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            return null;
        }
    };
    return imageGetter;
}

private class DownloadImageTask extends AsyncTask<String, Void, Drawable> {
    protected Drawable doInBackground(String... urls) {
        for(String s : urls) {
            try {
                Drawable drawable = Drawable.createFromStream(new URL(s).openStream(), "src name");
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                return drawable;
            } catch (IOException exception) {
                Log.v("IOException", exception.getMessage());
                return null;
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Drawable drawable) {
        super.onPostExecute(drawable);
    }
}
  

Это работает, кроме того, электронное письмо выглядит не так, как в WebView.. Что еще хуже, когда я хочу отправить это электронное письмо, электронное письмо выглядит не так, как раньше.

 Spanned html = Html.fromHtml(..);
email.setmHtmlMessage(Html.toHtml(html));
  

Есть ли какое-либо решение, чтобы исправить это и сделать так, чтобы оно выглядело как раньше?

Ответ №1:

Сделайте html составной строкой с помощью Html.fromHtml(htmldata) и установите для этого значение edittext.

Комментарии:

1. Спасибо, но в электронном письме не отображаются изображения .. И когда я хочу получить этот HTML-текст ответа из EditText и отправить его, я получаю не форматированное HTML-электронное письмо, а просто неформатированный текст из EditText..

2. оно не будет обрабатывать само изображение, мы должны передать Html. Изображение убедитесь, что я покажу изображение. используйте fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) и передайте imagegetter, который будет отображать изображение.

Ответ №2:

getImageHTML Необходимо запустить в отдельном потоке. Это можно сделать несколькими способами. Для этой конкретной задачи я рекомендую использовать AsyncTask , поскольку вы будете обновлять компонент пользовательского интерфейса.

Кроме того, setText должно быть в AsyncTask ‘s onPostExecute .