Cách dễ nhất là lưu trữ các cuộc gọi javascript trong plugin hoặc JavascriptInterface và có phương pháp lặp lại ở phía javascript của bạn. Bằng cách đó, loadUrl
không bao giờ được gọi.
Cái gì như:
StringBuilder sb = null;
private final Object LOCK = new Object();
public void sendJavascript(String js){
synchronized(LOCK) {
if (sb == null){
sb = new StringBuilder();
sb.append("javascript:");
}
sb.append(js):
}
}
Sau đó sử dụng một javascriptInterface:
private class JsInterface {
@JavascriptInterface
public String getJavascript(){
synchronized(LOCK) {
String javascriptToRun = sb.toString();
sb = new StringBuilder();
sb.append("javascript:");
return javascriptToRun;
}
}
}
Thêm giao diện javascript của bạn để webview của bạn:
JsInterface jsInterface = new JavascriptInterface();
webview.addJavascriptInterface(jsInterface, "JsInterface");
Và trên mã javascript của bạn thiết lập một khoảng thời gian hẹn giờ để truy xuất chức năng được lưu trữ.
EDIT
Tôi chỉ tìm thấy this answer, nó cho thấy tôi có một vấn đề lớn, các phương pháp chưa đồng bộ. Có nghĩa là khi bạn gọi getJavascript()
biến số sb
của chúng tôi có thể chưa sẵn sàng để đọc. Tôi đã thêm bit có liên quan vào nguồn ở trên.
SỬ DỤNG khóa hoặc mã của bạn sẽ không đáng tin cậy
Maby một giải pháp lộn xộn, bạn có thể cố gắng "ép" bàn phím để được hiển thị (google nó) hoặc kiểm tra trạng thái bàn phím, và nếu nhà nước là "không hiển thị", bạn có thể đặt bàn phím thành hiển thị. Không biết nếu nó hoạt động, chỉ là một ý tưởng. – Mdlc