2010-08-10 28 views

Trả lời

21

Tôi gặp vấn đề tương tự.

Thật không may, tôi không thể tìm thấy cách để làm cho các tùy chọn menu trình duyệt chuẩn xuất hiện. Bạn phải tự mình thực hiện. Những gì tôi đã làm là đăng ký WebView cho các menu ngữ cảnh với activity.registerForContextMenu(webView). Sau đó, tôi subclassed WebView và overrode phương pháp này:

@Override 
protected void onCreateContextMenu(ContextMenu menu) { 
    super.onCreateContextMenu(menu); 

    HitTestResult result = getHitTestResult(); 

    MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() { 
     public boolean onMenuItemClick(MenuItem item) { 
       // do the menu action 
       return true; 
     } 
    }; 

    if (result.getType() == HitTestResult.IMAGE_TYPE || 
      result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { 
     // Menu options for an image. 
     //set the header title to the image url 
     menu.setHeaderTitle(result.getExtra()); 
     menu.add(0, ID_SAVEIMAGE, 0, "Save Image").setOnMenuItemClickListener(handler); 
     menu.add(0, ID_VIEWIMAGE, 0, "View Image").setOnMenuItemClickListener(handler); 
    } else if (result.getType() == HitTestResult.ANCHOR_TYPE || 
      result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { 
     // Menu options for a hyperlink. 
     //set the header title to the link url 
     menu.setHeaderTitle(result.getExtra()); 
     menu.add(0, ID_SAVELINK, 0, "Save Link").setOnMenuItemClickListener(handler); 
     menu.add(0, ID_SHARELINK, 0, "Share Link").setOnMenuItemClickListener(handler); 
    } 
} 

Nếu bạn muốn làm một cái gì đó khác hơn là một menu ngữ cảnh, sau đó sử dụng một OnLongClickListener. Tuy nhiên, bạn muốn chặn sự kiện nhấp chuột dài, HitTestResult là chìa khóa. Đó là những gì sẽ cho phép bạn tìm ra những gì người dùng đã nhấp vào và làm điều gì đó với nó.

Tôi chưa thực sự triển khai "Lưu liên kết", tôi chỉ đưa nó làm ví dụ ở đây. Nhưng để làm như vậy bạn sẽ phải tự mình xử lý tất cả; bạn phải thực hiện yêu cầu HTTP GET, nhận phản hồi và sau đó lưu trữ nó ở đâu đó trên thẻ SD của người dùng. Không có cách nào mà tôi biết để trực tiếp gọi hoạt động tải xuống của ứng dụng Trình duyệt. Mã "Lưu liên kết" của bạn sẽ trông giống như sau:

HitTestResult result = getHitTestResult(); 
HttpClient httpclient = new DefaultHttpClient(); 
HttpGet httpget = new HttpGet(result.getExtra()); 
HttpResponse response = httpclient.execute(httpget); 
HttpEntity entity = response.getEntity(); 
if (entity != null) { 
    URL url = new URL(result.getExtra()); 

    //Grabs the file part of the URL string 
    String fileName = url.getFile(); 

    //Make sure we are grabbing just the filename 
    int index = fileName.lastIndexOf("/"); 
    if(index >= 0) 
      fileName = fileName.substring(index); 

    //Create a temporary file 
    File tempFile = new File(Environment.getExternalStorageDirectory(), fileName); 
    if(!tempFile.exists()) 
      tempFile.createNewFile(); 

    InputStream instream = entity.getContent(); 
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
    //Read bytes into the buffer 
    ByteArrayBuffer buffer = new ByteArrayBuffer(50); 
    int current = 0; 
    while ((current = bufferedInputStream.read()) != -1) { 
      buffer.append((byte) current); 
    } 

    //Write the buffer to the file 
    FileOutputStream stream = new FileOutputStream(tempFile); 
    stream.write(buffer.toByteArray()); 
    stream.close(); 
} 
+0

Tôi chưa thể kiểm tra mã này, vì tôi đang ở đâu, nhưng bạn có phải viết mã cho các tùy chọn trình đơn đó không? ví dụ. Lưu liên kết? Nếu vậy, làm thế nào bạn làm điều đó? –

+0

Vâng ... nó thực sự không may, nhưng đó là cách duy nhất tôi đã có thể làm điều đó. Tôi sẽ thêm một số chi tiết vào câu trả lời của tôi. –

+0

Toàn bộ lý do tôi quyết định sử dụng webView là vì trang web đã kiểm tra người giới thiệu và tôi không thể giả mạo nó bằng HttpClient. Có cách nào để kiểm tra URL và mở nó bằng Trình duyệt web hay tạo menu ngữ cảnh không? –

1

Tôi sẽ bật Javascript trong chế độ xem web. Sau đó, sử dụng onMouseDown() và onMouseUp() để xác định thời lượng nhấp chuột.

Bạn cũng có thể tạo menu bật lên trong Javascript (không phải menu chuẩn, mà là của riêng bạn).

Cuối cùng, bạn có thể tương tác giữa Javascript và mã Android/Java của mình.

Ví dụ về tương tác đơn giản giữa Javascript và ứng dụng Android.

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/src/com/google/android/webviewdemo/WebViewDemo.java


Ngoài ra, bạn có thể muốn để khởi động trình duyệt thực sự thay vì sử dụng một WebView.

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com")); 
startActivity(intent); 
+0

Tôi có thể xem Menu Android chuẩn bằng phương pháp Javascript không? –

+0

Tôi có thể chọn và chọn và chỉ giữ liên kết Lưu không? Ngoài ra, điều này sẽ làm việc khi sử dụng một OvverideUrlLoading? –

+0

Tôi không biết cách bật trình đơn trình duyệt chuẩn (trừ khi bạn khởi động trình duyệt thực) – LatinSuD

5

tôi sẽ nghĩ rằng bạn có thể sử dụng một cái gì đó như thế này:

WebView yourWebView; 
yourWebView.setLongClickable(true); 
yourWebView.setOnLongClickListener(...); 

Điều đó sẽ cho phép bạn bắt nhấp chuột dài trên xem. Những gì bạn làm sau đó ... đó là tùy thuộc vào bạn!

+1

Tôi có thể thấy menu Android chuẩn không? Tôi có thể chọn và chọn và chỉ giữ liên kết lưu không? –

0

Tôi chỉ muốn sao chép dữ liệu URL khi nhấp chuột dài.
Bằng cách tham khảo từ câu trả lời được chấp nhận, tôi đã viết điều này.

registerForContextMenu(webView); 


@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 

    WebView webView = (WebView) v; 
    HitTestResult result = webView.getHitTestResult(); 

    if (result != null) { 
     if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { 
      String linkToCopy = result.getExtra(); 
      copyToClipboard(linkToCopy, AppConstants.URL_TO_COPY); 
     } 
    } 
} 
Các vấn đề liên quan