Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - Preventing WebView reload on Rotate

When I rotate my screen, the WebView reloads the whole page. I can't have this since some of my content contains dynamic/random material. Currently when rotated the screen reloads the original URL from the loadUrl() method.

Any idea what's wrong with my code?

MainActivity.java

package com.mark.myapp;  import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.webkit.WebView; import android.webkit.WebViewClient;  public class MainActivity extends Activity {      WebView web;     String webURL = "http://www.google.co.uk/";      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          if (savedInstanceState != null)             ((WebView)findViewById(R.id.web)).restoreState(savedInstanceState);          web = (WebView) findViewById(R.id.web);         web.getSettings().setJavaScriptEnabled(true);         web.loadUrl(webURL);         web.setPadding(0, 0, 0, 0);         web.getSettings().setLoadWithOverviewMode(true);         web.getSettings().setUseWideViewPort(true);         web.getSettings().setSupportZoom(true);         web.getSettings().setBuiltInZoomControls(true);          web.setWebViewClient(new HelloWebViewClient());     }      @Override     public boolean onCreateOptionsMenu(Menu menu) {         getMenuInflater().inflate(R.menu.activity_main, menu);         return true;     }      private class HelloWebViewClient extends WebViewClient {         public boolean shouldOverrideUrlLoading(WebView web, String url) {             web.loadUrl(url);             return true;         }     }      public boolean onKeyDown(int keyCode, KeyEvent event) {         if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {             web.goBack();             return true;         }         return super.onKeyDown(keyCode, event);     }  } 

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.mark.myapp"     android:versionCode="1"     android:versionName="1.0" >      <uses-sdk         android:minSdkVersion="8"         android:targetSdkVersion="15" />      <application         android:icon="@drawable/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme" >         <activity             android:name=".MainActivity"              android:configChanges="orientation|keyboardHidden">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application>     <uses-permission android:name="android.permission.INTERNET"/> </manifest> 
like image 700
mark Avatar asked Aug 26 '12 14:08

mark


1 Answers

I think the main problem is that you call web.loadUrl(webURL); also when savedInstanceState != null

EDIT

Try:

if (savedInstanceState == null) {   web.loadUrl(webURL); } 

EDIT2: You also need the onSaveInstanceState and onRestoreInstanceState override.

@Override protected void onSaveInstanceState(Bundle outState ) { super.onSaveInstanceState(outState); web.saveState(outState); }  @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); web.restoreState(savedInstanceState); } 

Note: Please also add in your AndroidManifest.xml in your Activity android:configChanges="orientation|screenSize" Thanks

like image 80
Giuseppe Avatar answered Sep 19 '22 13:09

Giuseppe