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