user1574268
user1574268

Reputation:

Changing fragments and saving web view states - going mad

Ive been trying to do this for the best part of a week and still have no luck.

I have an action bar with tabs (action bar sherlock) and Im switching through the tabs and changing fragments fine.

Each fragment has a webview and Im trying to save the state of the webview so the web page stays on the same page that the user left it on.

Here is my fragment code:

public class FragmentB extends SherlockFragment {

WebView myWebView;

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   myWebView.saveState(outState);
   Log.w("///////", "onSaveInstanceState");

}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
   super.onActivityCreated(savedInstanceState);
   myWebView.restoreState(savedInstanceState);
   Log.w("///////", "onActivityCreated");

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w("///////", "onCreate");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     View mainView = (View) inflater.inflate(R.layout.frag_b, container, false);
     myWebView = (WebView) mainView.findViewById(R.id.webview);


     Log.w("///////", "onCreateView");


     if (savedInstanceState != null){

         myWebView.restoreState(savedInstanceState);
         Log.w("///////", "restore!");
     }
     else{
         Log.w("///////", "ELSE!");
         myWebView.setWebViewClient(new MyWebViewClient());
         myWebView.getSettings().setPluginsEnabled(true);
         myWebView.getSettings().setBuiltInZoomControls(false); 
         myWebView.getSettings().setSupportZoom(false);
         myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);   
         myWebView.getSettings().setAllowFileAccess(true); 
         myWebView.getSettings().setDomStorageEnabled(true);
         myWebView.loadUrl("http://www.google.com");   
     }



    //return inflater.inflate(R.layout.frag_b, container, false);
    return mainView;
}

public class MyWebViewClient extends WebViewClient {        

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".mp4")) 
        {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "video/*");

            view.getContext().startActivity(intent);
            return true;
        } 
        else {
            return super.shouldOverrideUrlLoading(view, url);
        }
    }

}

}

Any help would be great!

Upvotes: 6

Views: 6052

Answers (1)

Stephen Asherson
Stephen Asherson

Reputation: 1567

The onSaveInstanceState method of a fragment will only be called when the parent activity needs to save its state; an example of this is when the parent activity is being destroyed/recreated during an orientation change. As a result, this method won't be called when you are simply replacing fragments or switching between them as tabs.

As a workaround for your particular case, you can save the state of your webview in a bundle in the onPause method and restore it in the onActivityCreated method:

    // Instance fields        
    private WebView webView;
    private Bundle webViewBundle;

    /**
     * Save the state of the webview
     */
    @Override
    public void onPause()
    {
        super.onPause();

        webViewBundle = new Bundle();
        webView.saveState(webViewBundle);
    }

    /**
     * Restore the state of the webview
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        if (webViewBundle != null)
        {
            webView.restoreState(webViewBundle);
        }
    }

See here for more information as well:

How to save the state of a WebView inside a Fragment of an Action Bar

Upvotes: 4

Related Questions