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