Come salvare lo stato di una WebView in un Fragment di una Action Bar

L’idea di questo articolo mi è venuta a seguito del commento di Esthon Wood: “do you have any idea on how to save the state of the WebView? I mean, the webview refreshes everytime I tap on the tab.” sull’articolo Tab Layout in Android con ActionBar e Fragment.

Come punto di partenza io suppongo che tu abbia configurato correttamente l’esempio spiegato in Tab Layout in Android con ActionBar e Fragment.

Nei seguenti passi configuro una WebView nel secondo tab:

  1. sostituisci il file res/layout/tab2.xml
  2. sostituisci il file eu/lucazanini/Tab2Fragment.java

    • riga 24: la variabile webView punta alla WebView inserita nel layout res/layout/tab2.xml
    • riga 25: con questa istruzione la WebView è mostrata sotto il secondo tab, e non a schermo intero nascondendo la Action Bar, e ogni collegamento è aperto riutilizzando la webView stessa senza aprire il default browser; la controindicazione è che non ho più la barra degli indirizzi
    • riga 38: metodo onPause, qui salvo lo stato della webView nel Bundle webViewBundle; il metodo onPause è chiamato quando il Fragment sta per andare nel background (ad esempio quando seleziono l’altro tab), successivamente alla riselezione del secondo tab, nel metodo onCreate dopo aver verificato che esista un webViewBundle non nullo, lo uso per ripristinare lo stato della webView (riga 30)
  3. aggiungi un permesso per accedere a internet in AndroidManifest.xml
  4. lancia l’applicazione
    webview

Per altre configurazioni della WebView, come ad esempio abilitare il JavaScript, puoi fare riferimento a Building Web Apps in WebView.

11 Comments

 Add your comment
  1. how to create method onKeyDown in this Fragment?

  2. Hi,

    I’m a bit new to android. I nliked your example and it work really Good – Thank you.

    Could you please advise how do I add a progress bar to it?

  3. Post is excellent, i am looking for it since long time. as Mr.Adam Croth said. I got Same problem. Javascript is not working.

    Any solution for it.

    Thanks

  4. I’m using a fixed tab with swipe. There’s only one fragment they all share, and one webView that is always instantiated in my onCreateView. Pls how can I save the webView state for 6 TABS. it only saves for the first two. thanks

  5. Thank you for your tutorial,

    I have a problem, even I inserted Javascript activation code to one Fragment, Javascript is not working.

    String url = “http://www.site.com/”;

    webView = (WebView) ll.findViewById(R.id.webView3);
    webView.setWebViewClient(new WebViewClient());

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.getSettings().setJavaScriptEnabled(true);

    if (webViewBundle == null) {
    webView.loadUrl(url);
    } else {
    webView.restoreState(webViewBundle);
    }
    return ll;
    }

    How can I solve this problem?

    Thanks

  6. Friend, I am using your article as reference when I return in the webview Tab 2 takes about two seconds to reload, there is a way to solve this case? Thanks!!

    • You can try to replace the onTabSelected and onTabUnselected methods of the inner class TabListener inside TabActionBarActivity.java

      where I use “show” and “hide” instead of “attach” and “detach” at the lines 10 and 18.

  7. i used your idea. but when we rotate the phone or orientation changes , the links start opening in a new browser.

    how can we prevent that ??

    • I don’t have the issue you said.
      The row 25 in Tab2Fragment.java should prevent that.

      I think you don’t need but you can explicitly handle the page navigation as explained here.
      The shouldOverrideUrlLoading method should be:

      Go here for more info.

Leave a Comment

Your email address will not be published.