Android WebView:如何在Android WebView中更改JavaScript警告框的标题文本?

11
在我的Android应用程序中,我使用了一个WebView,在其中添加了一个按钮。点击该按钮后,我将调用一个JavaScript函数,该函数将显示一个警告框。在该警告框的标题中显示的是(“file://”所在页面说)。我想要更改这个标题为我自定义的文本。 如何更改这个标题?
3个回答

29

我通过实现setWebChromeClient解决了这个问题:

webView.setWebChromeClient(new WebChromeClient() {

    @Override
    public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
        AlertDialog dialog = new AlertDialog.Builder(view.getContext()).
                setTitle("YourAlertTitle").
                setMessage(message).
                setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //do nothing
                    }
                }).create();
        dialog.show();
       
        return true;
    } }); 

1
result.confirm(); 这一行会在点击按钮之前触发警告框的积极结果。这应该被移除。 - MillerMedia
1
@MillerMedia 谢谢您的建议,我已经采纳了您提出的修改。 - Mukesh Y.

4

MKY的答案对于只关心alert的情况可以正常工作,但如果您还关心confirmprompt,则还需要覆盖onJsConfirmonJsPrompt方法。

alertconfirm之间唯一的区别在于,对于confirm,您需要添加一个调用lambda中的result.cancel()方法的setNegativeButton

对于prompt,稍微有些复杂,因为您还需要向对话框添加文本编辑器。为此,您需要创建一个EditText对象,并使用AlertDialog.Builder.setView将其添加到对话框中,如此答案所述。

在所有三个对话框中,使用setOnDismissListener设置一个解除侦听器是一个好主意,以防对话框以其他方式被解除。例如,如果用户单击返回按钮或单击背景,则可能会发生这种情况。

以下是适用于alertconfirmprompt的完整代码。不要忘记在所有三种方法中更改"Title"为您想要的任何标题。

webView.setWebChromeClient(new WebChromeClient(){
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result){
        new AlertDialog.Builder(view.getContext())
            .setTitle("Title")
            .setMessage(message)
            .setPositiveButton("OK", (DialogInterface dialog, int which) -> result.confirm())
            .setOnDismissListener((DialogInterface dialog) -> result.confirm())
            .create()
            .show();
        return true;
    }

    @Override
    public boolean onJsConfirm(WebView view, String url, String message, JsResult result){
        new AlertDialog.Builder(view.getContext())
            .setTitle("Title")
            .setMessage(message)
            .setPositiveButton("OK", (DialogInterface dialog, int which) -> result.confirm())
            .setNegativeButton("Cancel", (DialogInterface dialog, int which) -> result.cancel())
            .setOnDismissListener((DialogInterface dialog) -> result.cancel())
            .create()
            .show();
        return true;
    }

    @Override
    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result){
        final EditText input = new EditText(view.getContext());
        input.setInputType(InputType.TYPE_CLASS_TEXT);
        input.setText(defaultValue);
        new AlertDialog.Builder(view.getContext())
            .setTitle("Title")
            .setMessage(message)
            .setView(input)
            .setPositiveButton("OK", (DialogInterface dialog, int which) -> result.confirm(input.getText().toString()))
            .setNegativeButton("Cancel", (DialogInterface dialog, int which) -> result.cancel())
            .setOnDismissListener((DialogInterface dialog) -> result.cancel())
            .create()
            .show();
        return true;
    }
});

1
这个适用于所有对话框。 - Ashish Chaugule
谢谢!onJsConfirm就是我在寻找的。 - MillerMedia
非常好的答案,因为它涵盖了所有可能的情况。 - David Refoua
非常好的答案,因为它处理了所有可能的情况。 - undefined

1
这里有一个Kotlin的例子:
另外,非常重要的是不要忘记添加result.confirm(),否则你的Webview会被冻结!
override fun onJsAlert(
        view: WebView,
        url: String,
        message: String,
        result: JsResult
    ): Boolean {
        val title = "yourtitle"
        val dialog: AlertDialog =
            AlertDialog.Builder(view.context).setTitle(title).setMessage(message)
                .setPositiveButton("OK",
                    { dialog, which ->
                        result.confirm()
                    }).create()
        dialog.show()
        return true
}

顺便说一句,对于那些像我一样在寻找WebViewClient()解决方案的人,你可以同时使用它和WebChromeClient(),因为并不是每个重写方法都适用于这两种类型的浏览器。以下是其中一种实现方式:添加WebView.webChromeClient = ChromeClient()和:
inner class ChromeClient internal constructor() : WebChromeClient() {
//Your Methods go here
}

只需在之后启动常规的WebViewClient来执行操作。
WebView.webViewClient = object : WebViewClient() {
//code goes here
}

它应该是val title = "yourtitle",而不是val title "yourtitle"(你忘记了=)。另外,{dialog, which -> result.confirm()}可以简化为{result.confirm()} - Donald Duck
谢谢你指出来。我已经纠正了它 :-) - Kirill Häuptli

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