2010-08-10 56 views

回答

21

我有這個相同的問題。

不幸的是,我找不到使標準瀏覽器菜單選項出現的方法。你必須自己實現每一個。我所做的就是在WebView上註冊與activity.registerForContextMenu(webView)的上下文菜單。然後,我的子類的WebView,並推翻了這種方法:

@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); 
    } 
} 

如果你想要做的比上下文菜單以外的東西,然後使用OnLongClickListener。但是,如果要截取長按事件,則HitTestResult是關鍵。這將允許您找出用戶點擊的內容並使用它進行操作。

我自己實際上還沒有實現「保存鏈接」,我只是將它作爲示例包含在這裏。但要做到這一點,你必須自己做所有的處理;您必須發出HTTP GET請求,接收響應,然後將其存儲在用戶的SD卡上。我無法直接調用瀏覽器應用程序的下載活動。您的「保存鏈接」代碼將如下所示:

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

由於我在哪裏,我無法測試此代碼,但是您是否必須爲這些菜單選項編寫代碼?例如保存鏈接?如果是這樣,你是怎麼做到的? – 2010-08-10 17:17:58

+0

是啊......這真的很不幸,但這是我能夠做到的唯一方法。我會在我的答案中添加更多的細節。 – 2010-08-10 18:28:30

+0

我決定使用webView的全部原因是因爲該網站正在檢查引用者,並且我無法用HttpClient來欺騙它。有什麼方法可以檢查URL,並用網絡瀏覽器打開它,或者創建一個上下文菜單? – 2010-08-10 19:00:15

1

我可以在web視圖中啓用Javascript。然後使用onMouseDown()和onMouseUp()來確定點擊的持續時間。

你也可以在Javascript中創建彈出式菜單(不是標準菜單,但是你自己的)。

最後,您可以在Javascript和您的Android/Java代碼之間進行交互。

Javascript和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


或者,您可能要推出的,而不是使用的WebView真正的瀏覽器。

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

我能使用Javascript方法看到標準的Android菜單嗎? – 2010-08-10 15:28:09

+0

我可以選擇並保留保存鏈接嗎?另外,當使用OvverideUrlLoading時這個工作是否會起作用? – 2010-08-10 15:29:12

+0

我不知道彈出標準瀏覽器菜單的方式(除非你確實啓動了實際的瀏覽器) – LatinSuD 2010-08-12 19:39:50

5

我想你可以使用這樣的事情:

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

這應該讓你捉對視圖長的點擊。之後你做了什麼......這取決於你!

+1

我可以看到標準的Android菜單嗎?我可以選擇並保留保存鏈接嗎? – 2010-08-10 15:28:42

0

我只是想長時間複製URL數據。
通過參考我接受的答案,我寫了這個。

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); 
     } 
    } 
}