Android网络视图:如何在Android Webview中更改JavaScript警报标题文本?

kxkpmulp  于 2022-11-20  发布在  Android
关注(0)|答案(2)|浏览(167)

在我的Android应用程序中,我使用了web视图,其中有一个按钮。单击该按钮时,我调用了一个JavaScript函数,该JavaScript函数有一个警报框。在该警报框中显示了标题(“file://”处的页面显示)。我想将此标题更改为我的自定义文本。如何更改此标题?

6jjcrrmo

6jjcrrmo1#

我已经通过实现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();
        result.confirm();
        return true;
    } });
ktca8awb

ktca8awb2#

如果您只对alert感兴趣,MKY's answer可以正常工作,但是如果您还对confirmprompt感兴趣,则还需要覆盖onJsConfirmonJsPrompt方法。
alertconfirm之间的唯一区别是,对于confirm,您需要添加一个setNegativeButton,它在lambda中调用result.cancel()方法。
对于prompt,这就有点复杂了,因为你还需要在对话框中添加一个文本编辑器。为此,你需要创建一个EditText对象,并使用AlertDialog.Builder.setView将其添加到对话框中,如this answer中所述。
在所有三个对话框中使用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;
    }
});

相关问题