WebViewFragment と画面回転

レイアウトXMLで、Fragmentタグを指定した WebViewFragment WebView が生成されるのは、
WebViewFragment の onCreateView メソッドである。抑制をかけない画面回転でここは必ず通ることになり
画面回転の度にページ読み込みをせざる得ない。
タブレットの画面サイズが大きく変わった時に、無駄のないレイアウトを組む目的で Fragment が導入された
とあるが、画面の向きによる XMLレイアウトを用意しても画面回転で毎回 WebView を生成したのでは、使えない。

仕方なく、AndroidManifest で
  android:configChanges="keyboardHidden|orientation|screenSize"
を宣言し、横向きも縦向きも同じレイアウトを用意して、
Activity の onConfigurationChanged でレイアウトを調整する。

サンプルは以下のとおり、

レイアウト XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
        <EditText
            android:id="@+id/urlEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:imeOptions="actionGo"
            android:inputType="textUri" >
        </EditText>
        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:max="100" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <fragment
            android:id="@+id/menuFragment"
            class="sample.SampleWebMenuFragment"
            android:layout_width="100dp"
            android:layout_height="match_parent" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical" >
            <fragment
                android:id="@+id/webFragment"
                class="sample.SampleWebFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#c0c0c0" >
               ここに操作ボタンを配置
            </LinearLayout>

        </LinearLayout>
    </LinearLayout>
</LinearLayout>

WebViewFragment のサンプルは、、、

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.DownloadListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewFragment;
/**
 * SampleWebFragment
 */

public class SampleWebFragment extends WebViewFragment{
   Activity activity;
   boolean isConnecting;

   public boolean isConnecting(){
      return isConnecting;
   }
   @Override
   public void onAttach(Activity _activity){
      super.onAttach(_activity);
      this.activity = _activity;
   }
   @Override
   public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setRetainInstance(true);
   }
   @Override
   public void onActivityCreated(Bundle savedInstanceState){

      super.onActivityCreated(savedInstanceState);
      setRetainInstance(true);
      WebView webview = getWebView();

      // WebSettings 設定
      setWebSettings(webview.getSettings());
      
      webview.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
      webview.setWebChromeClient(new WebChromeClient(activity){
         @Override
         public void onProgressChanged(WebView view, int newProgress){
            *1.getWebView()
.loadUrl("http:/xxxxxx/");
   }
   @Override
   public void onConfigurationChanged(Configuration newConfig){
      super.onConfigurationChanged(newConfig);
      configOrientation();
   }
   private void configOrientation(){
      Point point = new Point();
      overrideGetSize(getWindowManager().getDefaultDisplay(), point);
      if (point.x > point.y){
         getFragmentManager().findFragmentById(R.id.menuFragment).getView().setVisibility(View.VISIBLE);
      }else{
         getFragmentManager().findFragmentById(R.id.menuFragment).getView().setVisibility(View.GONE);
      }
   }
   @SuppressWarnings("deprecation")
   void overrideGetSize(Display display, Point outSize) {
      try{
         Class pointClass = Class.forName("android.graphics.Point");
         Method newGetSize = Display.class.getMethod("getSize", new Class[]{ pointClass });
         newGetSize.invoke(display, outSize);
      }catch(Exception ex){
         outSize.x = display.getWidth();
         outSize.y = display.getHeight();
      }
   }

   @Override
   public boolean onKeyDown(int keyCode,KeyEvent event){
      // BACKキーで終了する場合、終了前に WebView の後片付けをする
      if (keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
         *2.cleanWebView();
      }
      return super.onKeyDown(keyCode,event);
   }
}

*1:SampleActivity)getActivity()).progress(newProgress);
         }
         // Web DB quator Over時の処理
         @Override
         public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota
, long estimatedDatabaseSize, long totalQuota, QuotaUpdater quotaUpdater){
            quotaUpdater.updateQuota(5 * 1024 * 1024); // 5MB
         }
      });
      webview.setWebViewClient(new WebViewClient(activity){
         @Override
         protected void removeLoadingView(){
            ((SampleActivity)getActivity()).finishProgress();
         }
         @Override
         public void onPageStarted(WebView view, String url, Bitmap favicon){
            ((SampleActivity)getActivity()).startProgress();
            isConnecting = true;
         }
         @Override
         public void onPageFinished(WebView view, String url){
            ((SampleActivity)getActivity()).finishProgress();
            isConnecting = false;
         }
         // 他、省略。。。。
      });
      // ダウンロードリスナ
      webview.setDownloadListener(new DownloadListener(){
         @Override
         public void onDownloadStart(String url, String userAgent,String contentDisposition
, String mimetype, long contentLength){
            // TODO
         }
      });
   }

   // WebSettings 設定
   private void setWebSettings(WebSettings settings){
      if (settings==null) return;
      settings.setSupportZoom(true);
      settings.setPluginState(WebSettings.PluginState.ON);
      settings.setJavaScriptEnabled(true);
      settings.setSavePassword(false);
      settings.setLoadWithOverviewMode(true);
      settings.setBuiltInZoomControls(true);
      settings.setGeolocationEnabled(true);
      settings.setDomStorageEnabled(true);
      settings.setDatabaseEnabled(true);
   }
   public void cleanWebView(){
      WebView webview = getWebView();
      if (webview==null) return;
      webview.clearCache(true);
      webview.clearHistory();
      webview.clearFormData();
      webview.clearMatches();
      webview.clearAnimation();
      webview.clearDisappearingChildren();
      webview.clearSslPreferences();
      webview.clearView();
   }
}

Activityは、、、

public class SampleActivity extends Activity{
   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      requestWindowFeature(Window.FEATURE_NO_TITLE);
      setContentView(R.layout.web_main);
      

      ((SampleWebFragment)getFragmentManager().findFragmentById(R.id.webFragment

*2:SampleWebFragment)getFragmentManager().findFragmentById(R.id.webFragment