在我的Android应用程序中,我使用了一个WebView,在其中添加了一个按钮。点击该按钮后,我将调用一个JavaScript函数,该函数将显示一个警告框。在该警告框的标题中显示的是(“file://”所在页面说)。我想要更改这个标题为我自定义的文本。
如何更改这个标题?
我通过实现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;
} });
MKY的答案对于只关心alert
的情况可以正常工作,但如果您还关心confirm
和prompt
,则还需要覆盖onJsConfirm
和onJsPrompt
方法。
alert
和confirm
之间唯一的区别在于,对于confirm
,您需要添加一个调用lambda中的result.cancel()
方法的setNegativeButton
。
对于prompt
,稍微有些复杂,因为您还需要向对话框添加文本编辑器。为此,您需要创建一个EditText
对象,并使用AlertDialog.Builder.setView
将其添加到对话框中,如此答案所述。
在所有三个对话框中,使用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;
}
});
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
}
WebView.webChromeClient = ChromeClient()
和:inner class ChromeClient internal constructor() : WebChromeClient() {
//Your Methods go here
}
WebView.webViewClient = object : WebViewClient() {
//code goes here
}
val title = "yourtitle"
,而不是val title "yourtitle"
(你忘记了=
)。另外,{dialog, which -> result.confirm()}
可以简化为{result.confirm()}
。 - Donald Duck
result.confirm();
这一行会在点击按钮之前触发警告框的积极结果。这应该被移除。 - MillerMedia