WebChromeClient のカスタマイズ

Android WebViewjavascript alert()などを許可させる場合、
WebChromeClient を使うが、ほとんど同様のコードで対処できるのでは?
と思い、書いておく。。

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.TextView;
/**
 * CustomWebChromeClient
 */

public class CustomWebChromeClient extends WebChromeClient{
   private Context context;

   public CustomWebChromeClient(Context context){
      this.context = context;
   }

   @Override
   public boolean onJsAlert(WebView view,String url,final String message,final JsResult result){

      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      builder.setTitle(null);
      builder.setPositiveButton("OK",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface dialog,int which){
            result.confirm();
         }
      });
      builder.setCancelable(false);
      builder.setMessage(message).create().show();
      return true;
   }
   @Override
   public boolean onJsConfirm(WebView view,String url,final String message,final JsResult result){

      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      builder.setTitle(null);
      builder.setPositiveButton("Yes",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface dialog,int which){
            result.confirm();
         }
      });
      builder.setNegativeButton("No",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface arg0,int arg1){
            result.cancel();
         }
      });
      builder.setCancelable(false);
      builder.setMessage(message).create().show();
      return true;
   }
   @Override
   public boolean onJsPrompt(WebView view,String url,String message,String defaultValue,final JsPromptResult result){

      LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      View layout = inflater.inflate(R.layout.jsprompt,null);
      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      final AlertDialog dialog = builder.setCancelable(false).setView(layout).create();
      *1.setText(message);
      final EditText edit = (EditText)layout.findViewById(R.id.promptEditText);
      edit.setText(defaultValue);
      dialog.setButton("OK",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface _dialog,int which){
            result.confirm(edit.getText().toString());
         }
      });
      dialog.setButton2("cancel",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface _dialog,int which){
            result.cancel();
         }
      });
      dialog.show();
      return true;
   }
   @Override
   public boolean onJsBeforeUnload(WebView view,String url,String message,final JsResult result){

      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      builder.setTitle(null);
      builder.setPositiveButton("Yes",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface dialog,int which){
            result.confirm();
         }
      });
      builder.setNegativeButton("No",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface arg0,int arg1){
            result.cancel();
         }
      });
      builder.setCancelable(false);
      builder.setMessage(message).create().show();
      return true;
   }
   @Override
   public boolean onJsTimeout(){

      AlertDialog.Builder builder = new AlertDialog.Builder(context);
      builder.setTitle(null);
      builder.setPositiveButton("Done",new DialogInterface.OnClickListener(){
         @Override
         public void onClick(DialogInterface dialog,int which){
         }
      });
      builder.setCancelable(false);
      builder.setMessage("javascript Time out").create().show();
      return true;
   }
}
-------- R.layout.jsprompt のレイアウト ---------
<?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" >

    <TextView
        android:id="@+id/promptTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />


    <EditText
        android:id="@+id/promptEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text" >

        <requestFocus />
    </EditText>

</LinearLayout>

あまり使われないだろうが、、onJsBeforeUnload を実行させるための javascript は、例えば以下のようなスクリプト

  window.onbeforeunload = function(){
    return "移動または再表示してよろしいですか?";
  }

このメッセージ「移動または再表示してよろしいですか?」が、onJsBeforeUnload の引数 String message で渡される。

onJsTimeout がどうしても動く setTimeout の書き方がわからなかった。

*1:TextView)layout.findViewById(R.id.promptTextView