【发布时间】:2016-10-29 10:58:01
【问题描述】:
在我的 android 应用程序中,我在 web 视图中使用了 web 视图,我有一个按钮。单击该按钮时,我正在调用一个 JavaScript 函数,该 JavaScript 函数有一个警报框。在该警报标题中显示(“文件中的页面://“说)。我想将此标题更改为我的自定义文本。 如何更改该标题?
【问题讨论】:
标签: javascript java android webview
在我的 android 应用程序中,我在 web 视图中使用了 web 视图,我有一个按钮。单击该按钮时,我正在调用一个 JavaScript 函数,该 JavaScript 函数有一个警报框。在该警报标题中显示(“文件中的页面://“说)。我想将此标题更改为我的自定义文本。 如何更改该标题?
【问题讨论】:
标签: javascript java android webview
我已经通过实现 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;
} });
【讨论】:
如果您只对alert 感兴趣,MKY's answer 可以正常工作,但如果您还对confirm 和prompt 感兴趣,您还需要覆盖onJsConfirm 和onJsPrompt 方法。
alert 和 confirm 之间的唯一区别是,对于 confirm,您需要添加一个 setNegativeButton,它在 lambda 中调用 result.cancel() 方法。
对于prompt,它有点复杂,因为您还需要在对话框中添加一个文本编辑器。为此,您需要创建一个EditText 对象并使用AlertDialog.Builder.setView 将其添加到对话框中,如this answer 中所述。
在所有三个对话框中使用setOnDismissListener 设置关闭侦听器也是一个好主意,以防对话框以除单击按钮之外的其他方式关闭。例如,如果用户单击后退按钮或用户在后台单击,就会发生这种情况。
这是适用于alert、confirm 和prompt 的完整代码。不要忘记将所有三种方法中的"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;
}
});
【讨论】: