2012-10-24 22 views
7

Trong WebView khi tôi thực thi JavaScript thông qua webview.loadUrl(), phím chức năng biến mất nếu nó hiển thị. Khi tôi cố gắng nhập một số văn bản trong trường văn bản html, phím chức năng sẽ biến mất (nếu JavaScript được thực hiện) và tôi không thể nhập tất cả văn bản.Trên webview của Android khi tôi thực thi javascript, sotfkeyboard biến mất

Trường văn bản không bị mất tiêu điểm, vì vậy lời nhắc vẫn còn trên trường văn bản, nhưng phím chức năng sẽ bị hỏng.

Ai đó có thể cho tôi biết cách khắc phục điều đó không?

+0

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

Trả lời

1

Đó là hành vi mong đợi: bằng cách gọi WebView.loadUrl() bạn về cơ bản đang tải lại trang, do đó bàn phím mềm bị loại bỏ.

Hoặc, bạn có thể thử xác định xem bàn phím mềm có được hiển thị hay không và trì hoãn thực thi JS cho đến khi nó bị ẩn. Để biết phương pháp chung để kiểm tra trạng thái bàn phím mềm, hãy xem How to check visibility of software keyboard in Android?

5

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

Các vấn đề liên quan