webview加载页面,JS方法不能加载的问题解决

来源:互联网 发布:jquery 转js 编辑:程序博客网 时间:2024/06/11 10:41

   今天发现在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

0 0
原创粉丝点击