studio library fromhtml android html xml-parsing android-textview

library - html android studio



¿Cómo mostrar HTML en TextView? (18)

Tengo HTML simple:

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

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


¡Puedo sugerir una solución un tanto intrincada pero aún genial! Obtuve la idea de este artículo y la adapté para Android. Básicamente, utiliza una vista WebView e inserta el HTML que desea mostrar y editar en una etiqueta div editable. De esta manera, cuando el usuario toca la WebView aparece el teclado y permite la edición. ¡Usted acaba de agregar algo de JavaScript para recuperar el HTML editado y listo!

Aquí está 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; } }

Y here está el componente como una esencia.

Nota: No necesitaba la devolución de llamada de cambio de altura de la solución original, por lo que falta aquí, pero puede agregarla fácilmente si es necesario.


Cada vez que escriba una vista de texto personalizada, la función de texto del conjunto HTML básico se desvanecerá de algunos de los dispositivos.

Así que tenemos que hacer los siguientes pasos adicionales make is work.

La clase pública CustomTextView extiende TextView {

// dentro del constructor

setText(Html.fromHtml(getText().toString()));

}


Eche un vistazo a esto: https://.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>

Funciona solo para unas pocas etiquetas.


El mejor enfoque para usar las secciones de CData para la cadena en el archivo strings.xml para obtener una visualización real del contenido html en el TextView, el fragmento de código a continuación le dará una 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));

La sección de CData en el texto de cadena mantiene los datos de la etiqueta html intactos incluso después de formatear el texto usando el método String.format Por lo tanto, Html.fromHtml (str) funciona bien y verá el texto en negrita en el mensaje de bienvenida.

Salida:

Bienvenido, a tu tienda de aplicaciones de música favorita. Inicia sesión como: nombre de usuario


El siguiente código dio el 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);


Haz 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 puedes usarlo en tu Actividad / Fragmento como:

text_view.setText(stripHtml(htmlText));


He implementado esto usando la vista web. En mi caso, tengo que cargar la imagen desde la URL junto con el texto en la 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 varias respuestas usar la clase de marco Html.fromHtml() como se sugiere aquí, pero desafortunadamente esta clase tiene un comportamiento diferente en diferentes versiones de Android y varios errores no 214637 , como se demostró en los números 214637 , 14778 , 235128 y 75953 .

Por lo tanto, es posible que desee utilizar una biblioteca de compatibilidad para estandarizar y backport la clase Html en todas las versiones de Android, que incluye más devoluciones de llamada para elementos y estilos:

Proyecto Github HtmlCompat

Si bien es similar a la clase Html del marco, algunos cambios de firma fueron necesarios para permitir 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);


Si desea poder configurarlo a través de xml sin ninguna modificación en el código Java, puede encontrar útil esta idea. Simplemente llame a init desde el constructor y establezca 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"/>


Si está intentando mostrar HTML desde un ID de recurso de cadena, es posible que el formato no se muestre en la pantalla. Si eso te está sucediendo, intenta usar etiquetas CDATA en su 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));

Vea esta post para más detalles.


Si solo desea mostrar un texto html y no necesita realmente un TextView , tome un WebView y utilícelo de la siguiente manera:

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

Esto no te restringe a algunas etiquetas html tampoco.


También me gustaría sugerir el siguiente proyecto: https://github.com/NightWhistler/HtmlSpanner

El uso es casi el mismo que el convertidor de Android predeterminado:

(new HtmlSpanner()).fromHtml()

Lo encontré después de que ya comencé con la implementación propia de html para convertidor distribuible, porque el estándar Html.fromHtml no proporciona suficiente flexibilidad sobre el control de representación e incluso no existe la posibilidad de usar fuentes personalizadas de ttf


Uso simple Html.fromHtml("html string") . Esto funcionará. Si la cadena tiene etiquetas como <h1> entonces vendrán espacios. Pero no podemos eliminar esos espacios. Si aún desea eliminar los espacios, puede eliminar las etiquetas de la cadena y luego pasar la cadena al método Html.fromHtml("html string"); . Generalmente, estas cadenas provienen del servidor (dinámico) pero no a menudo, si es el caso, es mejor pasar la cadena tal como está al método que intentar eliminar las etiquetas de la cadena.



Html.fromHtml() usar Html.fromHtml() para usar HTML en sus cadenas XML. Simplemente haciendo referencia a una cadena con HTML en su diseño XML no funcionará.

Esto es lo que debes 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>")); }


setText (Html.fromHtml (bodyData)) está en desuso 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)); }


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


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