WebView




Si estamos trabajando desde un Fragment y con un listView hay que agregar
Hay que agregar
WebView clog = new WebView(getActivity());
switch (position){
        case 0: //créditos
               clog.getFullLogDialog(1).show();
               break;
        case 1: //porque usar totti app
               clog.getFullLogDialog(2).show();
               break;
}

Código del tutorial, trabajando desde un Activity

MyActivity.java
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MyActivity extends ActionBarActivity {

    WebView clog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        clog = new WebView(MyActivity.this);

        Button btnCon = (Button) findViewById(R.id.btnContenido);
        btnCon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                metodo1();
            }
        });

        Button btnOtro = (Button) findViewById(R.id.btnOtroContenido);
        btnOtro.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                metodo2();
            }
        });
    }

    public void metodo1(){
        clog.getFullLogDialog(1).show();
    }

    public void metodo2(){
        clog.getFullLogDialog(2).show();
    }
}

WebView.java
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.ContextThemeWrapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * Created by user on 24/09/2014.
 */
public class WebView {
    private final Context context;
    private int txt;
    public WebView(Context context) {
        this.context = context;
    }

    public AlertDialog getFullLogDialog(int txt2) {
        txt = txt2;
        android.webkit.WebView wv = new android.webkit.WebView(this.context);

        wv.setBackgroundColor(Color.BLACK);
        wv.loadDataWithBaseURL(null, this.getLog(), "text/html", "UTF-8",
                null);

        AlertDialog.Builder builder = new AlertDialog.Builder(
                new ContextThemeWrapper(
                        this.context, android.R.style.Theme_Dialog));
        builder
                //.setTitle(context.getResources().getString(R.string.changelog_full_title))
                .setView(wv)
                .setCancelable(false)
                        // OK button
                .setPositiveButton(
                        //context.getResources().getString(R.string.changelog_ok_button),
                        context.getResources().getString(android.R.string.ok),
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                                int which) {

                            }
                        });

        return builder.create();
    }


    /** modes for HTML-Lists (bullet, numbered) */
    private enum Listmode {
        NONE, ORDERED, UNORDERED,
    };

    private Listmode listMode = Listmode.NONE;
    private StringBuffer sb = null;

    private String getLog() {
        // read changelog.txt file
        sb = new StringBuffer();
        try {
            InputStream ins;
            switch (txt) {
                case 1: //contenido
                    ins = context.getResources().openRawResource(
                        R.raw.contenido);
                    break;
                case 2: //otrocontenido
                    ins = context.getResources().openRawResource(
                            R.raw.otrocontenido);
                    break;
                default:
                    ins = context.getResources().openRawResource(
                            R.raw.contenido);

            }
            BufferedReader br = new BufferedReader(new InputStreamReader(ins));

            String line = null;
            boolean advanceToEOVS = false; // if true: ignore further version
            // sections
            while ((line = br.readLine()) != null) {
                line = line.trim();
                char marker = line.length() > 0 ? line.charAt(0) : 0;
                if (marker == '$') {
                    // begin of a version section
                    this.closeList();
                    String version = line.substring(1).trim();
                    // stop output?
                } else if (!advanceToEOVS) {
                    switch (marker) {
                        case '%':
                            // line contains version title
                            this.closeList();
                            sb.append("<div class='title'>"
                                    + line.substring(1).trim() + "</div>\n");
                            break;
                        case '_':
                            // line contains version title
                            this.closeList();
                            sb.append("<div class='subtitle'>"
                                    + line.substring(1).trim() + "</div>\n");
                            break;
                        case '!':
                            // line contains free text
                            this.closeList();
                            sb.append("<div class='freetext'>"
                                    + line.substring(1).trim() + "</div>\n");
                            break;
                        case '?':
                            this.closeList();
                            sb.append("<div class='freetexttitle'>"
                                    + line.substring(1).trim() + "</div>\n");
                            break;
                        case '#':
                            // line contains numbered list item
                            this.openList(Listmode.ORDERED);
                            sb.append("<li>" + line.substring(1).trim() + "</li>\n");
                            break;
                        case '*':
                            // line contains bullet list item
                            this.openList(Listmode.UNORDERED);
                            sb.append("<li>" + line.substring(1).trim() + "</li>\n");
                            break;
                        default:
                            // no special character: just use line as is
                            this.closeList();
                            sb.append(line + "\n");
                    }
                }
            }
            this.closeList();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

    private void openList(Listmode listMode) {
        if (this.listMode != listMode) {
            closeList();
            if (listMode == Listmode.ORDERED) {
                sb.append("<div class='list'><ol>\n");
            } else if (listMode == Listmode.UNORDERED) {
                sb.append("<div class='list'><ul>\n");
            }
            this.listMode = listMode;
        }
    }

    private void closeList() {
        if (this.listMode == Listmode.ORDERED) {
            sb.append("</ol></div>\n");
        } else if (this.listMode == Listmode.UNORDERED) {
            sb.append("</ul></div>\n");
        }
        this.listMode = Listmode.NONE;
    }
}

contenido.txt (carpeta raw)
<html>
  <head>
    <style type='text/css'>
      a            { color:#a0a0e0 }
      div.title    {
          color:#C0F0C0;
          font-size:1.2em;
          font-weight:bold;
          margin-top:1em;
          margin-bottom:0.5em;
          text-align:center }
      div.subtitle {
          color:#C0F0C0;
          font-size:0.8em;
          margin-bottom:1em;
          text-align:center }
      div.freetext { color:#F0F0F0 }
      div.list     { color:#C0C0F0 }
    </style>
  </head>
  <body>
$
  % Quiero agradecer:
    * <b>Gabriel Salcedo</b> por la espectacular interfaz
    * Maria Ines Lund por el incentivo

$ END_OF_CHANGE_LOG
  </body>
</html>

otrocontenido.txt (carepta raw)
<html>
  <head>
    <style type='text/css'>
      a            { color:#a0a0e0 }
      div.title    {
          color:#C0F0C0;
          font-size:1.2em;
          font-weight:bold;
          margin-top:1em;
          margin-bottom:0.5em;
          text-align:center }
      div.subtitle {
          color:#C0F0C0;
          font-size:0.8em;
          margin-bottom:1em;
          text-align:center }
      div.freetext { color:#F0F0F0 }
      div.freetexttitle{
          color:#C0F0C0;
          font-size:1.2em;
          font-weight:bold;
          margin-top:1em;
          margin-bottom:0.5em;
      }
      div.list     { color:#C0C0F0 }
    </style>
  </head>
  <body>
$
  % Version 0.1
  _ Septiembre/2014
    * Primera versión, probando demandas de los usuarios y respuesta del servidor

$ END_OF_CHANGE_LOG
  </body>
</html>

Explicación de símbolos


$ Comienza la sección
% Comienza una línea de un título de la sección versión.
_ Comienza una línea de una sección de la versión de los subtítulos.
! comienza una línea de texto libre.
# Comienza una línea dentro de una lista numerada.
* Comienza una línea dentro de una lista de viñetas
? Comienza una línea alienación izquierda



Fuente: https://code.google.com/p/android-change-log/
De acá es la fuente, solo que lo he modificado bajo a mis necesidades.

Iconos http://romannurik.github.io/AndroidAssetStudio/icons-launcher.html

18 comentarios:

  1. Amigo, el codigo fueente no lo subiste ?

    ResponderEliminar
    Respuestas
    1. Si, no se te debe haber cargado bien la página, pero es lo que esta arriba.
      El contenido de los cuadro grise,
      El proyeto de github, en esta oportundad no lo he subido porque no me parecia gran cosa, pero si ves el tuto, seguro que te vas a guiar como inplementarlo.

      Eliminar
    2. Tenes razón no lo he subido, ahora lo voy a subir.
      Gracias por comentar.

      Eliminar
  2. Amigo, me podrias explicar como añadir esto a las preferencias, gracias.

    ResponderEliminar
  3. Muy útil Ramiro. ¿Y habría alguna manera de mostrar el texto justificado en un webView?
    Supongo que en un html y con la etiqueta style se podría definir un text-align:justify ¿Pero como lo asocio si quiero trabajar con un textView o un ediText para que tengan también un texto justificado?

    ResponderEliminar
    Respuestas
    1. para css es como vos decis text-align:justify pero para el textview es distinto te recomiendo ver esto -> http://stackoverflow.com/questions/1292575/android-textview-justify-text

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Gracias Ramiro por este post, pero necesito ayuda, estoy bloqueado haber quiero que con este codigo que te pongo, lo puedas incluir a las preferences.xml (Es decir como lo tiene usted en la parte de arriba pero con las preferences)

    Mi Codigo es este:
    findPreference("ChangeLog").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
    WebView webView = new WebView(getApplicationContext());
    webView.loadUrl("file:///android_asset/html/licenses.html"); //Sin HTML x con el .txt

    AlertDialog dialog = new AlertDialog.Builder(Setting.this).create();
    dialog.setTitle(R.string.open_source_changelog);
    dialog.setView(webView);
    dialog.setButton(getResources().getString(R.string.close), new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    dialog.cancel();
    }
    });
    dialog.show();

    return true;
    }
    });

    Este es el codigo, que te acabo de añadir es el que quiero que me ayudes, a ver si podemos meterlo dentro de las preferences y asin ayudamos a mas gente a y perdona por contestar a esta hora.

    ResponderEliminar
  6. Hola Ramiro, me encantan tus tutos, gracias por tu trabajo, ¿como puedo meter un WebView en una pestaña de un ActionBar Tabs?

    ResponderEliminar
  7. Hola Ramiro muchas gracias por los tutos etan muy buenos.
    tengo una duda, como hago para que mi aplicacion busque si hay nuevas actualizaciones en Playstore?

    ResponderEliminar
  8. Hola Ramiro, tengo un problema con "clog.getFullLogDialog(1).show();" me da el siguiente error: Cannot resolve method 'getFullLogDialog(int)' haciendo un copy & paste de todo tu código. Gracias por cualquier ayuda.

    ResponderEliminar
    Respuestas
    1. es el WebView, no te ha tomado de la clase que has agregado sino la que trae androidStudio, borra y el WebView que tiene en los import y vuelvelo a agregar

      Eliminar
    2. Me aperece el mismo error, el unico Webview de Android es webkit.WebView; y no carga esa funcion.

      Eliminar
    3. a la clase WebView cambiale el nombre por WebViewCustoms para no tener problemas

      Eliminar
  9. public class about1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.about);

    ImageButton f = (ImageButton) findViewById(R.id.imbtn_back);

    f.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
    finish();
    // System.exit(0);
    }
    });


    ListView lista = (ListView) findViewById(R.id.listView1);
    ArrayList arraydatos = new ArrayList();
    Datos datos;

    //Introducir los datos
    datos = new Datos(getResources().getDrawable(R.mipmap.ic_action_mail), "Contactenos", ".....@outlook.com");
    arraydatos.add(datos);

    datos = new Datos(getResources().getDrawable(R.mipmap.ic_action_edit), "Titulo 2", "Informacion 2");
    arraydatos.add(datos);

    //Creo el adapter personalizado
    AdapterDatos adapter = new AdapterDatos(this, arraydatos);

    //Lo aplicamos
    lista.setAdapter(adapter);
    }
    }


    ese es mi código como podría hacer q cada item del listview me envié a un webview como el ejemplo de arriba y también q abra un link a aun aplicación externa algo similar a su app tottiapp.

    ResponderEliminar
  10. hola me gustaria saber si me puedes esplicar de como insertar una pantalla de ustream para ver video en vivo de un canal y que no me aparescan los controles del video

    ResponderEliminar
  11. en un proyecto de android estudio
    gracias

    ResponderEliminar