11

Vấn đề miền: Android WebView dựa đầu đọc định dạng ePub -3.x Android CHỈ WebView chữ Selection + Javascript

Chúng ta cần nổi bật văn bản mà có thể truy cập thông qua các phương pháp JavaScript (tức là biến em trở đi, lần lượt em tắt, lưu chúng gửi email cho họ, vv)

Bất cứ ai trong biết, hãy sửa lại cho tôi nếu tôi sai: trong lựa chọn văn bản trên một WebView -

về cơ bản chúng ta đang trao một lớp phủ TextView (WebTextView) là tRONG BẤT CÁCH gắn liền với html cơ bản khác hơn là trực quan (công việc tốt đẹp trên lót tất cả lên và làm cho nó liền mạch, btw), o n mà chúng tôi thực hiện TextSelectionActionMode và ClipboardManager được cung cấp kết quả ... để làm rõ điều đó, HTML thực tế với WebView KHÔNG thực sự được chọn bất kỳ lúc nào trong quá trình này, đó là lý do tại sao JavaScript không thể truy cập kết quả hành động.

Vì vậy, để làm cho hành vi này hoạt động trong 3.1+, tôi có một vài kế hoạch có thể có để thực hiện lựa chọn của riêng tôi trên WebView - đây là phần mà tôi tự hỏi nếu tôi không thể nhìn thấy góc :) -

1) chụp MOTION_DOWN của nhấp chuột dài bắt đầu chế độ lựa chọn, ghi đè lên ActionSode ActionSode tích hợp (để chứng minh thương hiệu khách hàng - cách tôi tìm thấy để làm như vậy là để hackish nó đau) xem kéo, nắm bắt vị trí MOTION_UP, ánh xạ các coords này lên WebView và thực hiện lựa chọn của tôi dựa trên các coords (trong khi so sánh văn bản với văn bản được chụp bởi ClipboardManager)

2) tạo của riêng tôi "WebTextView" (toàn bộ lotta làm việc lol) và không-do-hackishly tạo ActionMode của riêng tôi và làm tất cả những điều trên.

3) sử dụng MotionEvents được tạo bởi quy trình chọn chứng khoán và bằng cách nào đó ghi đè lên mã ActionSode ActionSodeion được kích hoạt bởi điều này.

Đây là những tùy chọn tôi thấy, hy vọng sự gần gũi và thất vọng của tôi với điều này đã làm tôi mù đến một giải pháp đơn giản hơn (đọc như được xây dựng) hoặc hai.

Cảm ơn bạn lần nữa.

Trả lời

1

Tôi không chắc chắn 100% phương pháp/thuộc tính nào cung cấp cho bạn Phạm vi và lựa chọn. Tôi không thấy bất kỳ tài liệu nào trong tài liệu. Nhưng tôi đã có thể nhận được phạm vi được chọn bằng pixel sử dụng sự phản chiếu. Không chắc chắn nếu điều này giúp bất cứ ai, nhưng nghĩ rằng nó là giá trị đăng bài ở đây.

Region result = null; 
try { 
    Object[] params = null; 

    Method nativeGetSelectionRegion = WebView.class.getDeclaredMethod("nativeGetSelectionRegion"); 
    nativeGetSelectionRegion.setAccessible(true);  
    result = (Region)nativeGetSelectionRegion.invoke(this, params); 


    Log.i(TAG, "res: region " + result.getBounds().toShortString()); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

Hy vọng rằng sẽ giúp ai đó

EDIT: Đây không hoạt động trên 3.1+

+0

tin tưởng phản ánh là đau đớn, để nói rằng ít nhất ... tin tưởng javascript là bằng nhau đau đớn (như tôi biết, giải pháp của tôi bị hỏng trong WebView của 4.0, làm việc trên "như thế nào" khi tôi gõ) trong Javascript, document.getSelection() trả về đối tượng Selection, từ đó bạn có thể thu thập vị trí thực tế trong các điều khoản Document https://developer.mozilla.org/en/DOM/window.getSelection (nó áp dụng cho tài liệu hoặc giao diện cửa sổ) Tôi sẽ không tin tưởng bất cứ điều gì có nguồn gốc thông qua sự phản ánh trong thế giới Android; khá đơn giản, họ sẽ phá vỡ nó. Tất cả những gì được nói, đó là một kế hoạch sao lưu tốt đẹp nên javascript thất bại! – Dan

+0

Bạn kích hoạt document.getSelection() như thế nào? Chúng tôi đã thử rằng ban đầu và thấy rằng tải javascript thông qua loadUrl ("javascript: document.getSelection()"); gây ra sự lựa chọn rõ ràng nên không có gì ở đó cả. – smokingoyster

+0

bạn cần phải thực hiện việc nâng hạng nặng bên trong webview bằng javascript và trả về một chuỗi phân cách bằng dấu (trong trường hợp của tôi) với dữ liệu thích hợp mà bạn đang theo dõi. tức là, sử dụng JavaScriptInterface làm bộ thu cho đối tượng chọn "phẳng" được tạo trong javascript. Ngoài ra, tùy thuộc vào những gì bạn đang làm với dữ liệu đó (tôi đã sử dụng dữ liệu của tôi để chọn thời gian thực), hãy nhớ rằng việc phân phối tới chuỗi giao diện người dùng sẽ là cần thiết (vì điều này rất có thể KHÔNG ở trên chuỗi giao diện người dùng), do đó, một mẫu Handler có thể, tốt, tiện dụng ... – Dan

11

tôi đã làm việc này trong 2.2 - 4.0.3. Tôi đã sử dụng giao diện javascript và chuyển tất cả các lần chạm vào nó. Giải pháp này dường như hoạt động khá tốt và tôi đã đặt một dự án ví dụ về github. Dự án github bao gồm các js cần thiết trong thư mục asset cũng như trang kiểm tra và xem web tải trang thử nghiệm và thực hiện tất cả các phương thức cần thiết để xử lý lựa chọn. Liên kết đến dự án github là https://github.com/btate/BTAndroidWebViewSelection. Có nó.

+0

Rất tốt, tôi không thể sử dụng các thư viện JS khác nhau do tốc độ nhấn khi tải các trang HTML lớn (cụ thể cho các ứng dụng của chúng tôi), vì vậy tôi đã kết thúc viết js từ đầu. – Dan

+0

Cảm ơn bạn đã đăng bài này trên GitHub, btate. – mikejonesguy

+3

@btate trên dự án github không hoạt động đối với HĐH phiên bản 4.1 +. – sachin003

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