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

在Android开发中,遇到WebView无法加载JS方法的问题,即使设置了setJavaScriptEnabled(true)也无效。通过使用WebChromeClient并重写其相关方法,如onJsAlert,问题得到解决。参考链接提供了一个可行的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值