Corso programmazione Android Lezione 11: WebView
Le altre lezioni del Corso di Programmazione Android sono reperibili a questo indirizzo
In questa lezione studieremo le WebView, un componente molto importante nella programmazione Android.
Il codice sorgente mostrato in questa lezione è reperibile qui.
Nella nostra app utilizziamo il componente in uno dei Tab dell’activity Visualizza Libri, tale Tab infatti si connetterà a Wikipedia per mostrarci la pagina relativa all’autore (nell’idea originale doveva mostrare la pagina relativa al libro ma non sempre le pagine hanno lo stesso formato nell’Url).
Pratica
Accesso a Internet
Prima di tutto la nostra App deve avere il permesso di poter accedere a Internet, per assegnare tali permessi dobbiamo servirci del file AndroidManifest.xml. Aggiungiamo, prima di <application, la seguente riga:
<uses-permission android:name="android.permission.INTERNET" />
Adesso la nostra App può accedere a internet.
Il tab Autore
Vediamo il codice relativo al layout (file vis_libri_tab3.xml):
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/paper_tile"> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/paper_tile" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <WebView android:id="@+id/wb_libro" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout>
Tutti i componenti li conosciamo già e il WebView è molto semplice quindi passiamo al codice Java del fragment (file VisLibriTab3.java):
package com.begeekmyfriend.bereader; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.webkit.WebViewClient; import java.util.StringTokenizer; public class VisLibriTab3 extends Fragment { String id_db, nome_autore; DatabaseBeReader db; Cursor c; public VisLibriTab3() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); View rootView = inflater.inflate(R.layout.fragment_vis_libri_tab3, container, false); // Inflate the layout for this fragment Bundle args = getArguments(); id_db = args.getString("ID"); //Recuperiamo l'id passatoci dall'Activity db = new DatabaseBeReader(getActivity()); db.open(); c = db.fetchById(id_db); //Lancio la query By id if ( c.getCount() > 0) //Dopo aver aperto il db inizializza i componenti { while (c.moveToNext()) { //anche se ho sicuramente un solo recordo mi serve un ciclo nome_autore = c.getString(c.getColumnIndex(DatabaseBeReader.BeReaderMetaData.AUTORE)); //Leggo l'autore } } nome_autore = iniziali_maiuscole(nome_autore); WebView wb_libro = (WebView) rootView.findViewById(R.id.wb_libro); wb_libro.getSettings().setJavaScriptEnabled(true); wb_libro.getSettings().setLoadsImagesAutomatically(true); wb_libro.loadUrl("http://it.wikipedia.org/wiki/"+ nome_autore); wb_libro.setWebViewClient(new WebViewClient()); //Senza questa riga apre su un browser esterno o sull'app di Wikidpedia return rootView; } public String iniziali_maiuscole(String stringa) //Metodo che trasforma la stringa da "nome cognome" a "Nome_Cognome" { //così da poter aprire la pagina wikipedia StringBuffer result = new StringBuffer(); String tmp = null; StringTokenizer stTk = null; int pos; stTk = new StringTokenizer(stringa, " "); while (stTk.hasMoreTokens()) { tmp = stTk.nextToken(); result.append( tmp.replaceFirst( tmp.substring(0, 1), tmp.substring(0, 1).toUpperCase() ) ); result.append(" "); } nome_autore = result.toString(); pos= nome_autore.indexOf("'"); if (pos>0) stringa = stringa.substring(0,pos) + stringa.substring(pos,pos+2).toUpperCase() + stringa.substring(pos+2); stringa = stringa.replaceAll(" ", "_"); //Sostituisco gli spazi con il carattere _ (per wikipedia) return stringa; } }
La classe contiene anche un metodo di utilità che trasforma l’autore nel formato “Nome_Cognome” che andremo ad aggiungere all’url di wikipedia (le pagine relative alle persone di solito hanno questo formato, quelle relative ai testi hanno formati molto diversi, ad esempio a volte c’è (Romanzo), e abbiamo l’incognita degli accenti). Il metodo esula dagli scopi di questo corso quindi lascio al lettore l’onere di studiarlo.
Vediamo nel dettaglio la parte relativa alla WebView:
WebView wb_libro = (WebView) rootView.findViewById(R.id.wb_libro); wb_libro.getSettings().setJavaScriptEnabled(true); wb_libro.getSettings().setLoadsImagesAutomatically(true); wb_libro.loadUrl("http://it.wikipedia.org/wiki/"+ nome_autore); wb_libro.setWebViewClient(new WebViewClient()); //Senza questa riga apre su un browser esterno o sull'app di Wikidpedia
Come vediamo l’uso è molto semplice: creiamo un oggetto, abilitiamo Javascript, il caricamento automatico delle immagini (metodi opzionali), assegniamo una url e evitiamo che Android si faccia furbo volendo aprire pagine speciali con l’app loro assegnata (come wikipedia).
Il risultato finale è questo:
Intanto li sviluppo dell’app è andato avanti è quasi pronta provatela scaricando i sorgenti.