2010-12-27 30 views
7

Tôi sử dụng WebView cho ứng dụng Androind của tôi. Tôi gặp sự cố và yêu cầu giải pháp trợ giúp.Bàn phím trong nhập văn bản HTML biến mất khi WebView gọi 'loadUrl' lần nữa

Có một trường văn bản trong trang HTML. Khi nó được 'tập trung' và sau đó tôi gọi

  mWebView.setFocusableInTouchMode(true); 

trong mã Java để các mềm bàn phím Android sẽ pop-up để cho tôi chìa khóa trong.

Vấn đề là tôi không cần sử dụng multi-thread đối với một số quy trình trong Java và gọi

  mWebView.loadUrl(strJSCall); 

làm gọi lại để thực thi chức năng JavaScript nhưng bàn phím bị ẩn!

Cách tôi cố gắng là buộc bàn phím hiển thị lại. Nhưng làm sao bàn phím luôn có thể hiển thị khi 'loadUrl' được gọi? Có ai gặp vấn đề tương tự và giải quyết nó không?

Trân trọng, Jr.

+0

Tôi gặp sự cố tương tự trên Android 3.0 (Motorola Zoom). Trên các thiết bị khác với android 2.x nó hoạt động bình thường. Bạn đã tìm thấy một giải pháp? –

Trả lời

2

Tôi có cùng một vấn đề và đã không được giải quyết hoàn toàn nó được nêu ra.

tôi đã có thể để buộc các bàn phím để hiển thị sau khi gọi webView.loadUrl, trước tiên bạn cần phải tìm hiểu xem các bàn phím được hiển thị, tôi đã sử dụng một phiên bản sửa đổi của này How to check visibility of software keyboard in Android?

sau đó gọi

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(webview, InputMethodManager.SHOW_IMPLICIT); 

Nhưng nếu như tôi bạn cần liên lạc với JavaScript trong WebView sau mỗi lần bấm phím thì cách tiếp cận này khiến bàn phím nhấp nháy khi nó cố gắng hoạt ảnh lên và xuống.
Nó cũng bỏ sót một số đầu vào tùy thuộc vào tốc độ bạn gõ.

5

Vấn đề với loadUrl là nó ngắt chuỗi giao diện người dùng và vẫn sẽ đóng phương thức nhập. Cách duy nhất để làm điều này là kiểm tra xem con trỏ trên webview là gì và ghi đè hành vi loadUrl mặc định trên chế độ xem web của bạn.

Bên trong webview tùy chỉnh của bạn:

@Override 
public void loadUrl(String url) { 
    HitTestResult testResult = this.getHitTestResult(); 
    if (url.startsWith("javascript:)" && testResult != null && testResult.getType() == HitTestResult.EDIT_TEXT_TYPE) 
    { 
      //Don't do anything right now, we have an active cursor on the EDIT TEXT 
      //This should be Input Method Independent 
    } 
    else 
    { 
     super.loadUrl(url); 
    } 
} 

này sẽ ngăn chặn các bên có nguồn gốc từ tải Javascript từ bắn khi bạn có tập trung vào một lĩnh vực văn bản trong webkit. Nó không hoàn hảo nhưng nó tránh được sự lộn xộn của việc cố gắng tìm hiểu xem trường văn bản của bạn có hiển thị hay không bằng cách thay đổi kích cỡ của WebView. Việc thực thi Javascript trong webview vẫn hoạt động tốt.

Một lần nữa, nếu bạn cần một cái gì đó để cập nhật khi bạn đang gõ, bạn có thể phải tìm một cách khác để Java giao tiếp với Javascript không chặn chuỗi giao diện người dùng. Đây là một vấn đề khó khăn mà tôi vẫn chưa giải quyết đúng cách.

+0

Cảm ơn bạn đã trả lời. Tôi đã ghi đè API này nhưng sử dụng cách "phản chiếu" để tránh cuộc gọi hàm ẩn bàn phím ảo. –

+0

@Jr. bạn có thể giải thích chính xác bạn đã làm gì để sửa lỗi này? Cảm ơn. – Piotr

1

Trong Android, thực hiện javascript từ WebView là một chiều: gọi WebView.loadUrl ("javascript: sub (1,1)"); Bạn không thể nhận được giá trị trả về trực tiếp.

Có một cách async để có được những giá trị hàm JavaScript trở lại: How to get return value from javascript in webview of android?

Nhưng trong hầu hết trường hợp, chúng ta cần một phương pháp đồng bộ thay cho cách async.Ví dụ: khi sự kiện nhấp được chuyển vào phương thức onTouch của Android WebView, chúng tôi muốn thực thi JavaScript để đọc thông tin phần tử được nhấp vào.

Tôi đã thử hai giải pháp: biến 1. Sử dụng Java P/V để quấn một phương pháp đồng bộ từ async trên, giải pháp trông giống như: How to get return value from javascript in webview of android?

Giải pháp này hoàn toàn không làm việc, bởi vì phương pháp chờ đợi sẽ chặn việc thực thi JavaScript và JavaScriptInterface. Vì vậy, nếu chúng ta muốn có được kết quả của phương thức js trong một Thread UI. Điều đó là không thể.

  1. Sử dụng Java Reflection để lấy Giao diện gốc của chuỗiByEvaluatingJavaScriptFromString. Exist stringByEvaluatingJavaScriptFromString for Android

Hoạt động rất tốt, điều duy nhất cần quan tâm là phương pháp phản chiếu ban đầu khi trang được tải xong. Tôi đã cố gắng để khởi tạo sự phản chiếu bên trong constructor của WebView, nhưng thất bại. Tôi nghĩ rằng hàm tạo là phương thức không đồng bộ.

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