2012-01-13 37 views
5

Được biết là difficult để chọn văn bản được chọn trong một WebView vì lựa chọn văn bản WebView thực sự được xử lý bởi một lớp riêng, WebTextView.Lấy văn bản đã chọn trong WebView qua thanh tác vụ theo ngữ cảnh

Tuy nhiên, với bản phát hành gần đây Android 4.0 Design guidelines, dường như có một tia hy vọng đạt được điều này thông qua các thanh hành động theo ngữ cảnh (CAB). Nó says:

Sử dụng CAB bất cứ khi nào bạn cho phép người dùng chọn dữ liệu qua báo chí dài. Bạn có thể kiểm soát nội dung hành động của CAB để chèn các hành động mà bạn muốn người dùng có thể thực hiện.

Tôi có hiểu sai điều này không? Có cách nào để truy xuất văn bản đã chọn từ WebView qua CAB không?

Sau khi chế độ chọn văn bản và nhấp chuột dài bắt đầu, tôi hiện có thể phát hiện khi ActionMode bắt đầu và sửa đổi bản sao/dán gốc Menu; tuy nhiên, tôi không thể tìm ra cách thực sự truy xuất văn bản đã chọn.

+0

Hey @octopi, bạn có thể vui lòng cho tôi biết cách bạn thực sự phát hiện khi ActionMode bắt đầu và cách bạn sửa đổi menu? Những gì tôi đạt được là phát hiện một cú nhấp chuột dài và tự khởi động ActionMode, cung cấp một thanh tuỳ chỉnh thông qua 'ActionMode.Callback', nhưng điều đó sẽ không hiển thị các con trỏ chọn văn bản. – davids

+0

@davids. Mà không nói lựa chọn, tôi cũng muốn biết làm thế nào để khiếm khuyết hoặc sửa đổi trình đơn. Tôi có một giải pháp khá xấu nếu bạn không cần sử dụng 'ActionMode' ngoài lựa chọn văn bản. Tôi ghi đè lên 'public ActionMode onWindowStartingActionMode (ActionMode.Callback callback)' trên hoạt động. Nói 'return super.onWindowStartingActionMode (new MyActionModeCallback());'. Nó hoạt động và các con trỏ không biến mất. Tuy nhiên, tôi không biết tác dụng phụ của cách giải quyết này sẽ gây ra điều gì. Tôi có thể nghĩ rằng đó không phải là hệ thống muốn chúng tôi làm. – Yeung

+0

@Yeung tôi cũng có nhu cầu ghi đè thanh tác vụ nhưng cần xử lý lựa chọn – Ravi

Trả lời

8

Bạn chưa thể thực hiện điều đó với API hiện tại.

tôi đã đệ đơn yêu cầu tính năng cho điều này - Issue 24.841: WebView nên cho phép các ứng dụng để cung cấp một tùy chỉnh theo ngữ cảnh Action Bar http://code.google.com/p/android/issues/detail?id=24841

Về cơ bản, WebView trong 4.0 đã hardcoded riêng theo ngữ cảnh Action Bar của nó (CAB). CAB đó có một tham chiếu quay lại WebView và với tham chiếu đó, nó có thể nhận được văn bản đã chọn. Tôi không chắc làm thế nào bạn có thể phát hiện ActionMode bắt đầu và sửa đổi menu, nhưng nếu bạn có thể làm tất cả điều đó, thì bạn bị kẹt vì getSelection() là gói riêng tư hiện tại. Tôi đã gửi đó dưới dạng vấn đề riêng và liên kết nó với vấn đề trước đó ở trên.

+0

Vẫn không khắc phục được vấn đề này? – clu

0

Bạn có thể sử dụng javascript để lấy văn bản đã chọn: window.getSelection() và sử dụng hàm addJavascriptInterface của WebView để trả lại kết quả.

+1

Điều đó sẽ không hoạt động. Vui lòng đọc câu hỏi gốc – johnoodles

+0

@ johnnoodles Bạn có chắc chắn không?Tôi hiện đang sử dụng một cái gì đó như sau để có được lựa chọn văn bản trong một WebView: 'wvWebView.loadUrl (" javascript: if0.textOut (document.getSelection(). ToString()); ");' where 'if0' là một JavascriptInterface với một phương thức 'textOut (String s)'. Nó hoạt động tốt cho tôi (mặc dù tôi vẫn còn có vấn đề khác) - điều này phá vỡ một số phần của chức năng yêu cầu mà tôi đã bỏ lỡ? Vấn đề là phương pháp này không đúng thông qua CAB? – Erhannis

0

cảm ơn thông tin của bạn, tôi đã giải quyết được vấn đề khó khăn .. Tôi chỉ muốn thêm một số chức năng vào mã hành động. Sau đây là mã của tôi, Có thể hữu ích cho người khác.

@Override 
public ActionMode onWindowStartingActionMode(Callback callback) { 
    // TODO Auto-generated method stub 
    ActionMode mode = super.onWindowStartingActionMode(callback); 
    mode.getMenuInflater().inflate(R.menu.actions, mode.getMenu()); 
    mode.getMenu().findItem(R.id.action_add).setOnMenuItemClickListener(new OnMenuItemClickListener() { 

     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
      // TODO Auto-generated method stub 
      Log.i("", "onMenuItemClick add "); 
      return false; 
     } 
    }); 
    return mode; 
} 
+0

Wing Chen, câu trả lời nằm ngoài ngữ cảnh. Vui lòng đọc câu hỏi thực tế. – Adnan

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