我有一个带有自定义WebViewClient类的WebView,它允许我对用户对WebView内部链接的点击作出反应并处理它们。 这是代码:
class WebViewClickClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
String note = "";
String note_id = new String(url);
if (note_id.contains("#")) {
int offset = note_id.indexOf("#");
note_id = note_id.substring(offset + 1, note_id.length());
}
for (int i = 0; i < bookNotes.size(); i++) {
if (bookNotes.get(i).noteId().equals(note_id)) {
note = bookNotes.get(i).noteSection();
break;
}
}
if (!note.isEmpty()) {
Toast.makeText(getContext(), note, LENGTH_LONG).show();
}
}
现在它不再起作用了,点击时甚至没有触发WebViewClient的方法。相反,我收到此消息:I/chromium: [INFO:CONSOLE(0)] "Not allowed to navigate top frame to data URL:"
我是否需要立即使用JavaScript处理此问题,或者是否有适用于Android的WebView的解决方法?
更新 对于任何对使用JS接口进行解决方案感兴趣的人来说,我就是这样做的。
对用户点击作出反应的逻辑从onPageFinished
方法移至
private class JSInterface {
public void showToast(String key) {...}
}
然后,WebView创建如下:
WebView book_view;
book_view = (WebView) view.findViewById(R.id.web_text_view);
book_view.getSettings().setJavaScriptEnabled(true);
book_view.addJavascriptInterface(new JSInterface(), "JAVA_CODE");
JAVA_CODE
对象将从JavaScript代码中调用,该代码必须通过将文本内容与JS连接并在WebView上调用loadData()
方法动态添加到每个WebView“页面”。
StringBuilder j_script = new StringBuilder();
if (note_ids.size() > 0) {
j_script.append("<script type=\"text/javascript\">\nfunction jscallback()\n{");
for (int i = 0; i < note_ids.size(); i++) {
j_script.append("var dv" + i + " = document.getElementById(\"" + note_ids.get(i) + "\");\ndv" + i + ".onclick = function() {JAVA_CODE.showToast(\"" + note_ids.get(i) + "\")};\n");
}
j_script.append("}</script>");
}