2012-04-02 22 views
8

Tôi đang di chuyển ứng dụng web sang phiên bản Android. Sau khi nhận và xử lý dữ liệu JSON, tôi có một mảng đối tượng Javascript đang được giữ trong trang.Tôi có thể chuyển đối tượng Javascript vào Android WebView không?

Làm cách nào để chuyển nội dung hoàn chỉnh của một trong các đối tượng javascript "ra" vào vùng chứa webview để hiển thị bằng các điều khiển Android gốc?

Cuối cùng, tôi có thể tạo giao diện javascript với phương thức có tham số cho từng thuộc tính đối tượng javascript có thể - nhưng điều này dường như quá nặng.

Có ai có thể trợ giúp việc này không?

+1

Kiểm tra câu trả lời trong chủ đề tương tự http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –

Trả lời

15

Android WebView chứa phương pháp có tên addJavascriptInterface(Object obj, String interfaceName) sẽ hữu ích ở đây.

Sử dụng phương pháp này, đối tượng obj mà bạn thêm làm giao diện có thể được truy cập thông qua mã JavaScript trong Chế độ xem web. Trong trường hợp của bạn, bạn có thể truyền vào một đối tượng có phương thức setter chuyển một số đối tượng JavaScript trở lại Java.

Bạn vẫn cần phải tạo mã keo để chuyển đổi đối tượng JavaScript của bạn thành đối tượng JSON. Để có cách tiếp cận nhanh chóng, bạn chỉ có thể có giao diện tạo JSONObject ở phía Java bằng cách sử dụng một chuỗi JSON được truyền từ JavaScript. Lớp JSONObject trong Java có một hàm tạo chấp nhận một chuỗi chứa dữ liệu JSON. Vì vậy, bạn có thể chuyển kết quả đã được xâu chuỗi trực tiếp trở lại Java và tạo đối tượng theo cách đó. Ví dụ:

class JSInterface { 
    HashMap<String, JSONObject> mObjectsFromJS = new HashMap<String, JSONObject>(); 
    public void passObject(String name, String json) { 
     mObjectsFromJS.put(name, new JSONObject(json)); 
    } 
} 

//At some point, register using: 
mJSInterface = new JSInterface(); 
mWebView.addJavascriptInterface(mJSInterface, "Android"); 

Sau đó, ở phía bên JavaScript, trong xử lý mà có một blob của chưa phân tích JSON trong biến jsonData:

Android.passObject("pageItems", jsonData); 

Bây giờ, JSInterface bạn ở phía bên Java sẽ có một JSONObject chứa các mục mà bạn có thể truy cập bằng cách sử dụng các getters do JSONObject cung cấp. Các đối tượng được tạo qua cuộc gọi Javascript sẽ nằm trong bản đồ mObjectsFromJS. Tất nhiên bạn sẽ muốn thêm các phương thức trợ giúp bổ sung vào lớp JSInterface để cho phép quản lý các đối tượng tốt hơn.

Tôi chưa biên soạn hoặc thử nghiệm bất kỳ phương pháp nào trong số này, vì vậy bạn có thể phải chỉnh sửa chúng một chút để hoạt động tốt. Nhưng hy vọng điều này mang lại cho bạn ý tưởng. Tuy nhiên, nếu các đối tượng có giao diện và các mục dữ liệu nhất quán thì sẽ dễ dàng hơn khi tạo một hàm keo JavaScript đơn giản liên kết các thuộc tính đối tượng JavaScript với các trường đối tượng Java sử dụng các phương thức setter.

XIN LƯU Ý Điều này mang lại khả năng mã từ xa để kích hoạt mã gốc trên thiết bị của bạn. Nếu bạn không có toàn quyền kiểm soát các trang/tập lệnh được tải vào WebView, bạn phải đảm bảo rằng hành vi được hiển thị bởi obj không cho phép bất kỳ lần khai thác nào.

+0

Cảm ơn bạn Jason, Từ những gì bạn đang nói, nó không thể "đơn giản" chuyển đối tượng javascript trực tiếp đến một hàm setter java và mong đợi nó được dịch. Vì vậy, để tiếp tục, tôi sẽ cần phải: - mất đối tượng JSON của tôi và trở lại nó trở lại một json mã hóa chuỗi - vượt qua chuỗi mã hóa sao lưu thông qua giao diện javascript - giải mã nó thành một đối tượng java Tất cả những điều đó để có thể truy cập dữ liệu chính xác. Cảm ơn bạn đã làm rõ điều này. – Simon

+0

Sau khi đã cố gắng để có được câu trả lời này để làm việc, tôi đã phát hiện ra rằng giao diện javascript là hoàn toàn bị hỏng trong v2.3.x của Android. Xấu hổ. – Simon

+0

nếu tôi muốn làm cho hàm Java của tôi trở thành một hàm tạo, vì vậy tôi sẽ gọi ví dụ: 'var ob = new Android.MyObject()', làm cách nào để trả về một đối tượng javascript gốc? – Michael

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