Pregunta

tengo sencillo HTML:

<h2>Title</h2><br>
<p>description here</p>

Quiero mostrar texto con estilo HTML en TextView.¿Como hacer esto?

¿Fue útil?

Solución

Es necesario utilizar Html.fromHtml() para utilizar HTML en el código XML Cuerdas. Basta con hacer referencia a una cadena con HTML en su diseño XML no funcionará.

Esto es lo que debe hacer:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}

Otros consejos

setText(Html.fromHtml(bodyData)) es obsoleto después de la API 24.Ahora tienes que hacer esto:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
      tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
 } else {
      tvDocument.setText(Html.fromHtml(bodyData));
 }

Tenga una mirada en esto: https://stackoverflow.com/a/8558249/450148

Es bastante bueno también !!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>

Sólo funciona para algunas etiquetas.

Si usted quiere ser capaz de configurarlo a través de XML sin ninguna modificación en el código de Java es posible que esta idea útil. Simplemente le llamamos INIT del constructor y establecer el texto como html

public class HTMLTextView extends TextView {
    ... constructors calling init...
    private void init(){
       setText(Html.fromHtml(getText().toString()));
    }    
}

XML:

        <com.package.HTMLTextView
        android:text="@string/about_item_1"/>

El código de abajo dio mejor resultado para mí.

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);

Si usted está tratando de mostrar HTML a partir de un identificador de recurso de cadena, el formato puede no aparecer en la pantalla. Si lo que está sucediendo a usted, trate de usar las etiquetas CDATA lugar:

strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>

...

MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));

posterior para más detalles.

String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
    SiteLink= (TextView) findViewById(R.id.textViewSite);
    SiteLink.setText(Html.fromHtml(value));
    SiteLink.setMovementMethod(LinkMovementMethod.getInstance());

Si lo que desea es mostrar algún texto HTML y realmente no necesita un TextView, luego tomar un WebView y utilizarlo como siguiente:

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);

Esto no se limita a unas pocas etiquetas HTML tampoco.

La mejor manera de utilizar las secciones CDATA para la cadena en el archivo strings.xml para obtener una visualización real del contenido html en el TextView el siguiente fragmento de código le dará la idea justa.

//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>

//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));

sección CDATA en el texto de cadena mantiene los datos de etiqueta html intactas incluso después de formatear el texto utilizando el método String.Format. Así, Html.fromHtml (str) funciona bien y verá el texto en negrita en el mensaje de bienvenida.

Salida:

  

Bienvenido, a su tienda favorita aplicación de música. Conectado como: nombre de usuario

Vale la pena mencionar que el método HTML .fromHtml (fuente cadena) está en desuso a partir del nivel de la API 24. Si ese es su API de destino, debe utilizar Html.fromHtml (fuente String, int flags) su lugar.

Me gustaría también sugerir siguiente proyecto: https://github.com/NightWhistler/HtmlSpanner

El uso es casi lo mismo que por defecto Android convertidor:

(new HtmlSpanner()).fromHtml()

Lo encontramos después de que ya empecé por propia implementación de HTML al convertidor spannable, porque Html.fromHtml norma no proporciona suficiente flexibilidad en la prestación de control e incluso hay posibilidad de utilización de fuentes personalizadas a partir de TTF

simple uso Html.fromHtml("html string"). Esto funcionará. Si la cadena tiene etiquetas como <h1> continuación espacios vendrán. Pero no podemos eliminar esos espacios. Si aún desea eliminar los espacios, a continuación, puede quitar las etiquetas de la cadena y luego pasar la cadena a la Html.fromHtml("html string"); método. También, en general estas cadenas vienen de servidor (dinámico), pero no a menudo, si es el caso, es mejor pasar la cadena, ya que es el método de tratar de eliminar las etiquetas de la cadena.

String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)

Hacer un método global como:

public static Spanned stripHtml(String html) {
            if (!TextUtils.isEmpty(html)) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
                } else {
                    return Html.fromHtml(html);
                }
            }
            return null;
        }

También puede usarlo en su actividad / fragmento como:

text_view.setText(stripHtml(htmlText));

Me han implementado esta usando vista web. En mi caso tengo la imagen de carga de URL para junto con el texto en vista de texto y esto funciona para mí.

WebView myWebView =new WebView(_context);
        String html = childText;
        String mime = "text/html";
        String encoding = "utf-8";
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);

Se ha sugerido a través de diversas respuestas a utilizar el HTML clase de marco como se sugiere aquí, pero por desgracia, esta clase tiene un comportamiento diferente en diferentes versiones de Android y varios errores sin dirección, como se demuestra en temas 214637 , 14.778 , 235.128 y 75953 .

Por lo tanto, puede que quiera usar una biblioteca de compatibilidad para estandarizar y acondicionarlo la clase HTML a través de las versiones de Android que incluye más devoluciones de llamada para los elementos y estilo:

  

Github proyecto HtmlCompat

Si bien es similar a la clase HTML del marco, se requiere algunos cambios en la signatura para permitir que más devoluciones de llamada. Aquí está la muestra de la página de GitHub:

Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
//        imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);

Sé que esta pregunta es viejo. Otras respuestas aquí lo que sugiere Html.fromHtml() método . Sugiero que usted utilice HtmlCompat.fromHtml() del paquete androidx.core.text.HtmlCompat. Como esta es la versión compatible con versiones anteriores de la clase Html.

Código de ejemplo:

import androidx.core.text.HtmlCompat;
import android.text.Spanned;
import android.widget.TextView;

String htmlString = "<h1>Hello World!</h1>";

Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);

TextView tvOutput = (TextView) findViewById(R.id.text_view_id);

tvOutput.setText(spanned);

De esta manera se puede evitar Android comprobación de versión de la API y fácil de usar (solución única línea).

Siempre que escriba vista texto personalizado función de texto conjunto de HTML básico será obtener el formulario desapareció algunos de los dispositivos.

Así que tenemos que hacer los siguientes pasos complementarias que hacen es trabajo

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}
public class HtmlTextView extends AppCompatTextView {

public HtmlTextView(Context context) {
    super(context);
    init();
}

private void init(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
    } else {
        setText(Html.fromHtml(getText().toString()));
    }
 }
}

anterior

¿Puedo sugerir una solución un tanto hacky, pero aún genio! Tengo la idea de este artículo y lo adaptó para Android. Básicamente se utiliza un WebView e insertar el código HTML que desea mostrar y editar en una etiqueta div editable. De esta manera, cuando el usuario toca la WebView que aparezca el teclado y permite la edición. Ellos sólo tiene que añadir algo de JavaScript para recuperar el editada HTML y listo!

Este es el código:

public class HtmlTextEditor extends WebView {

    class JsObject {
        // This field always keeps the latest edited text
        public String text;
        @JavascriptInterface
        public void textDidChange(String newText) {
            text = newText.replace("\n", "");
        }
    }

    private JsObject mJsObject;

    public HtmlTextEditor(Context context, AttributeSet attrs) {
        super(context, attrs);

        getSettings().setJavaScriptEnabled(true);
        mJsObject = new JsObject();
        addJavascriptInterface(mJsObject, "injectedObject");
        setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                loadUrl(
                        "javascript:(function() { " +
                            "    var editor = document.getElementById(\"editor\");" +
                            "    editor.addEventListener(\"input\", function() {" +
                            "        injectedObject.textDidChange(editor.innerHTML);" +
                            "    }, false)" +
                            "})()");
            }
        });
    }

    public void setText(String text) {
        if (text == null) { text = ""; }

        String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
        String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
        loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
        // Init the text field in case it's read without editing the text before
        mJsObject.text = text;
    }

    public String getText() {
        return mJsObject.text;
    }
}

aquí es el componente como un Gist.

Nota: Yo no necesitaba la devolución de llamada cambio de altura de la solución original, de modo que falta aquí, pero usted puede agregar fácilmente si es necesario

.

Si utiliza clases androidx. * en su proyecto, se debe utilizar HtmlCompat.fromHtml(text, flag). Fuente del método es:

@NonNull public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) { if (Build.VERSION.SDK_INT >= 24) { return Html.fromHtml(source, flags); } //noinspection deprecation return Html.fromHtml(source); }

Es mejor manera que Html.fromHtml ya que hay menos código, sólo una línea, y la forma recomendada para utilizarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top