webview加載頁面,JS方法不能加載的問題解決

   今天發現在webview,沒有辦法加載JS方法,跳不出那種提示框,就是寫了webview.getSettings().setJavaScriptEnabled(true); 這一句也完全沒用。後來發現網上說的解決方案是用要用到WebChromeClient ,並且重寫它裏面的幾個方法才行。

  MyWebChromeClient.java

package com.example.webview_js;

import android.app.AlertDialog;
import android.content.DialogInterface;  
import android.content.DialogInterface.OnCancelListener;  
import android.content.DialogInterface.OnClickListener;  
import android.content.DialogInterface.OnKeyListener;  
import android.graphics.Bitmap;  
import android.os.Message;  
import android.util.Log;  
import android.view.KeyEvent;  
import android.webkit.JsPromptResult;  
import android.webkit.JsResult;  
import android.webkit.WebChromeClient;  
import android.webkit.WebView;  
import android.widget.EditText;  
  
/** 
17. * http://618119.com/archives/2010/12/20/199.html 
18. */  
 
//****************************************************************************  
public class MyWebChromeClient extends WebChromeClient {  
   @Override  
    public void onCloseWindow(WebView window) {  
        super.onCloseWindow(window);  
    }  
  
    @Override  
    public boolean onCreateWindow(WebView view, boolean dialog,  
           boolean userGesture, Message resultMsg) {  
        return super.onCreateWindow(view, dialog, userGesture, resultMsg);  
    }  
  
    /**  
     * 覆蓋默認的window.alert展示界面,避免title裏顯示爲“:來自file:////”  
     */  
   public boolean onJsAlert(WebView view, String url, String message,  
           JsResult result) {  
        final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());  
                 
       builder.setTitle("對話框")  
                .setMessage(message)  
                .setPositiveButton("確定", null);  
                  
        // 不需要綁定按鍵事件  
        // 屏蔽keycode等於84之類的按鍵  
        builder.setOnKeyListener(new OnKeyListener() {  
            public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {  
                Log.i("onJsAlert", "keyCode==" + keyCode + "event="+ event);  
               return true;  
            }  
        });  
        // 禁止響應按back鍵的事件  
       builder.setCancelable(false);  
        AlertDialog dialog = builder.create();  
        dialog.show();  
        result.confirm();// 因爲沒有綁定事件,需要強行confirm,否則頁面會變黑顯示不了內容。  
        return true;  
        // return super.onJsAlert(view, url, message, result);  
    }  
 
    public boolean onJsBeforeUnload(WebView view, String url,  
           String message, JsResult result) {  
        return super.onJsBeforeUnload(view, url, message, result);  
    }  
  
    /** 
67.     * 覆蓋默認的window.confirm展示界面,避免title裏顯示爲“:來自file:////” 
68.     */  
    public boolean onJsConfirm(WebView view, String url, String message,  
            final JsResult result) {  
       final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());  
        builder.setTitle("對話框")  
                .setMessage(message)  
               .setPositiveButton("確定",new OnClickListener() {  
                            public void onClick(DialogInterface dialog,int which) {  
                                result.confirm();  
                            }  
                        })  
                .setNeutralButton("取消", new OnClickListener() {  
                   public void onClick(DialogInterface dialog, int which) {  
                       result.cancel();  
                    }  
                });  
        builder.setOnCancelListener(new OnCancelListener() {  
            @Override  
           public void onCancel(DialogInterface dialog) {  
               result.cancel();  
            }  
        });  
  
        // 屏蔽keycode等於84之類的按鍵,避免按鍵後導致對話框消息而頁面無法再彈出對話框的問題  
       builder.setOnKeyListener(new OnKeyListener() {  
            @Override  
           public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {  
                Log.v("onJsConfirm", "keyCode==" + keyCode + "event="+ event);  
               return true;  
           }  
        });  
        // 禁止響應按back鍵的事件  
        // builder.setCancelable(false);  
       AlertDialog dialog = builder.create();  
        dialog.show();  
        return true;  
        // return super.onJsConfirm(view, url, message, result);  
    }  
  
    /** 
108.     * 覆蓋默認的window.prompt展示界面,避免title裏顯示爲“:來自file:////” 
109.     * window.prompt('請輸入您的域名地址', '618119.com'); 
110.     */  
    public boolean onJsPrompt(WebView view, String url, String message,  
            String defaultValue, final JsPromptResult result) {  
        final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());  
                  
       builder.setTitle("對話框").setMessage(message);  
                  
        final EditText et = new EditText(view.getContext());  
        et.setSingleLine();  
        et.setText(defaultValue);  
       builder.setView(et)  
                .setPositiveButton("確定", new OnClickListener() {  
                    public void onClick(DialogInterface dialog, int which) {  
                       result.confirm(et.getText().toString());  
                    }  
          
               })  
               .setNeutralButton("取消", new OnClickListener() {  
                    public void onClick(DialogInterface dialog, int which) {  
                        result.cancel();  
                    }  
                });  
  
        // 屏蔽keycode等於84之類的按鍵,避免按鍵後導致對話框消息而頁面無法再彈出對話框的問題  
       builder.setOnKeyListener(new OnKeyListener() {  
            public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {  
                Log.v("onJsPrompt", "keyCode==" + keyCode + "event="+ event);  
               return true;  
            }  
        });  
  
        // 禁止響應按back鍵的事件  
        // builder.setCancelable(false);  
        AlertDialog dialog = builder.create();  
        dialog.show();  
        return true;  
        // return super.onJsPrompt(view, url, message, defaultValue,  
       // result);  
    }  
  
    @Override  
   public void onProgressChanged(WebView view, int newProgress) {  
        super.onProgressChanged(view, newProgress);  
    }  
  
    @Override  
    public void onReceivedIcon(WebView view, Bitmap icon) {  
       super.onReceivedIcon(view, icon);  
    }  
  
   @Override  
    public void onReceivedTitle(WebView view, String title) {  
        super.onReceivedTitle(view, title);  
    }  
  
    @Override  
   public void onRequestFocus(WebView view) {  
        super.onRequestFocus(view);  
    }  
}  


在加載URL前寫上這兩行,應用上去

MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
webview.setWebChromeClient(myWebChromeClient);


  這樣就可以了。文章借見:http://www.imooo.com/web/web/962004.htm

  MyWebChromeClient.java 適用性蠻大的,我沒改就OK了大笑

 

代碼下載:http://download.csdn.net/detail/chexitianxia/9032525

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章