WebView 在 Lollipop 设备上无法显示 JSAlert

13

它在任何设备上都没有显示JSAlert。然后我设置了一个WebChromeClient:

webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message,
                    JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message,
                    String defaultValue, JsPromptResult result) {
                return super.onJsPrompt(view, url, message, defaultValue,
                        result);
            }

        });

现在它在所有 Lollipop 之前的设备上都可以正常工作,并且在 Lollipop 设备上不会显示任何警报。

Logcat 显示 "无法创建对话框,WebView 上下文不是一个 Activity"。


查看在Activity之外的Webview中显示AlertDialog帖子可能会有所帮助。 - ρяσѕρєя K
@ρяσѕρєяK 我已经遇到过这个问题了。它没有帮助。结果还是一样的。我实际上在 onJSAlert 方法中设置了断点,以检查它是否被调用。但它并没有被调用。 - Seshu Vinay
@SeshuVinay 调试器是否通过return super.onJsPrompt(view, url, message, defaultValue, result);这一行?如果是,请移除super调用并使用您外部活动的上下文放置自定义对话框。 - bonnyz
你已经修复了吗? - Bojan Kseneman
@BojanKseneman 不是。有修复方法吗? - Seshu Vinay
3个回答

4

0

首先需要获取权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

如果您正在使用Jscript在Webview中打开,您可以像这样创建对话框,在您的Jscript中编写以下代码。
<input type="button" value="Display dialog" onClick="displayDialog()" />
    <script>
        function displayDialog() {
            //alert("Javascript Dialog");
            Android.showDialog();
        }
    </script>
</input>

在WebView中创建对话框的一个非常简单的方法

webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            mResult = result;
            AlertDialog dialog = new AlertDialog.Builder(MyService.this)
                    .setTitle("test Dialog")
                    .setMessage("This is test dialog")
                    .setOnCancelListener(new CancelListener())
                    .setNegativeButton("Cancel", new CancelListener())
                    .setPositiveButton("Ok", new PositiveListener())
                    .create();
            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            dialog.show();

            return true;
        }
    });

如果上述方法都不起作用,最后一件事情是您需要在布局程序中创建自定义对话框,并将您的视图添加到其中。例如:

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT, 
                WindowManager.LayoutParams.WRAP_CONTENT
                WindowManager.LayoutParams.TYPE_PHONE,
                0,
                PixelFormat.TRANSLUCENT);

params.gravity = Gravity.CENTER;

windowManager.addView(yourView, params);

1
如果该HTML页面是动态的,我们该如何实现呢?这就是问题所在。它不是一个本地文件,无法添加JS函数。我只需要为Webview启用警报窗口,而不是针对本地文件。 - Tamilselvan Kalimuthu
没错。我的页面是一个银行页面,它在支付网关中出现。我无法编辑它。 - Seshu Vinay
对我来说也是一样的 @SeshuVinay - Tamilselvan Kalimuthu
为什么窗口类型必须设置为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT?在Android 5.x或6.x中,对话框可以完美地显示在WebView的顶部,没有这个限制。 - Alex Bitek

0
请分享您用于构建WebView的代码。听起来您是使用Service或Application Context构建它,而不是Activity。
请尝试使用Activity context。

1
https://code.google.com/p/chromium/issues/detail?id=447607 我只使用活动上下文,这个问题仅存在于Android系统WebView的最新更新中,我正在寻找解决方案。 - Tamilselvan Kalimuthu
我支持@TamilselvanKalimuthu的观点。问题出在早期版本的设备上,最新版的Android似乎存在一个bug。 - Seshu Vinay
我明白了,谢谢澄清。你可以试试在 Google Play 商店中最新的 WebView beta 版本吗?详情请参见 https://plus.google.com/u/0/communities/105434725573080290360 - ksasq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接