Dudas de Android + leer HTML desde fichero

LLoid

Buenas, siento dar más el coñazo (no hago na más que preguntas por aquí) pero llevo poco tiempo con Android y tengo una duda que por más que busco no tengo muy claro como solucionar. La cosa es que quiero mostrar en un textView dentro de un ScrollView un ladrillo de considerable tamaño en HTML. Este ladrillo está en un fichero que he metido en /assets. El código que tengo en onCreate() es:

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ayuda__cmmi);
		AssetManager am = this.getAssets();
		InputStream is = null;
		try {
			is = am.open("ejemplo.txt"); //Contiene el HTML a leer
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String total = is; //Aquí no sé qué hacer
		TextView text = (TextView)findViewById(R.id.textView1);
		text.setText((Html.fromHtml(total)));
	}

En la línea del String total = is; he probado con is.toString(); pero me saca la ruta interna o algo que no tengo ni idea de qué es, pero desde luego el HTML no xD Y no hay manera de que me muestre el texto formateado con el HTML (ni sin formatear tampoco).

En fin, si podéis echarme una mano mil gracias.

EDIT: SOLUCIONADO, lo pongo por si a alguien más le pasa:

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ayuda__cmmi);
		AssetManager am = this.getAssets();
		InputStream is = null;
		try {
			is = am.open("ejemplo.txt");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		InputStreamReader inputStreamReader = new InputStreamReader(is);
		BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
		StringBuilder stringBuilder = new StringBuilder();
		String line = null;
		try {
			while ((line = bufferedReader.readLine()) != null){
				stringBuilder.append(line).append("\n");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		TextView text = (TextView)findViewById(R.id.textView1);
		text.setText((Html.fromHtml((stringBuilder.toString()))));
	}
Tig

Sin meterme a una solución completa, en un proyecto similar use un WebView y le cargaba la ruta de assets

mHtmlTemplate = FileUtils.fileToString(getActivity().getAssets().open(HTML_TEMPLATE_RELATIVE_PATH));

donde

public static String fileToString(InputStream is) throws IOException
  {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8192);
    StringBuilder builder = new StringBuilder();
    String line;    

// For every line in the file, append it to the string builder
while((line = reader.readLine()) != null)
{
  builder.append(line+"\n");
}

return builder.toString();
  }

En mi caso opté por esta solución porque tenía muchos html que mostrar y el cliente quería pasarme los estilos, así que cargaba una plantilla en el webView y luego metía el html+css por javascript.

Pero vaya, si quieres usar un TextView, mírate esto http://stackoverflow.com/questions/2116162/how-to-display-html-in-textview

myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));

edit: veo que lo tenías ya solucionado. Un consejo, separa la funcionalidad en bloques pequeños, y esta operación de I/O deberías meterla a un Loader para no hacerla en el hilo principal.

1 respuesta
LLoid

#2 Hola, ese hilo lo vi también, pero tenía el problema de que no sabía como leer del InputStream (aunque luego me di cuenta de que era bastante obvio xD), y gracias por comentarme lo del loader. Al final también opté por un WebView en vez de el TextView, porque el TextView no mostraba correctamente los caracteres, y, más importante, los links internos no eran activables, cuando lo que quería era hacer una especie de índice al principio del documento para ir moviéndome por él (es un fichero de ayuda bastante tocho).

LLoid

Otra duda tengo xD a ver si alguien me echa una mano.

¿Es posible guardar varios estados distintos de la interfaz de una actividad y después seleccionar uno de ellos para recuperar el estado de la actividad?

Sé que suena un poco raro, pero creo que se entiende la pregunta.

1 respuesta
Tig

#4 no se entiende mucho... Si es una duda de otro tema mejor abre otro hilo, que si no es un lío

1 respuesta
LLoid

Sí, mejor abro otro hilo y lo explico un poco más, aunque creo que con sharedPreferences se puede medio hacer, aunque no tengo muy claro cómo.

#5 Bueno, pues creado está, no quisiera abusar de tu paciencia pero si te pasas y le echas un ojo genial :3

http://www.mediavida.com/foro/dev/shared-preferences-en-android-482656

Usuarios habituales

  • LLoid
  • Tig