2013-06-15 8 views
11

Podobnie jak w przypadku innych przeglądarek, takich jak Chrome i Firefox, potrzebuję, aby użytkownik długo kliknął link, a następnie wyświetliło menu kontekstowe, ale jeśli długo kliknęło coś i nie jest to link, to nie rób nic.Wyświetlenie strony w systemie Android, ustawienie Włączone z długim kliknięciem tylko w linkach?

Używanie registerForContextMenu(myWebView); pozwala na długie kliknięcie dowolnego obiektu, którego nie chcę. Dlatego myślę, że trzeba odfiltrować obiekty z registerForContextMenu(myWebView); lub parsować html dla linków, które wydają się przesadzone. Próbowałem również nadrzędne shouldOverrideUrlLoading metody:

private boolean isLongClicked = false; 

this.webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        if(isLongCLicked){ 
          //do something 
        }else 
       view.loadUrl(url); 

      return true; 
     } 

    }); 

    webView.setOnLongClickListener(new OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 
         isLongClicked = true; 
        forumView.performClick(); 
         isLongCLicked = false; 
        return false; 
       } 
      }); 

Szukałem w tym wątku Enable longClick in WebView ale nie pomógł mi. Próbowałem go wdrożyć, ale zbliżam się do siły.

import android.content.Context; 
import android.view.ContextMenu; 
import android.view.MenuItem; 
import android.webkit.WebView; 

public class WebViewSub extends WebView { 


    public WebViewSub(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    @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("save image") 
        .setOnMenuItemClickListener(handler); 
      menu.add("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("Save Link") 
        .setOnMenuItemClickListener(handler); 
      menu.add("Share Link") 
        .setOnMenuItemClickListener(handler); 
     } 
    } 
} 

Wreszcie Próbowałem przy użyciu HitTestResult, To jest chyba najbliżej mam do rozwiązania problemu.

myWebView.setOnLongClickListener(new OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       registerForContextMenu(myWebView); 
       WebView.HitTestResult result = forumView.getHitTestResult(); 
       if(result.getType() == 7){ 


        openContextMenu(myWebView); 

       } 
       unregisterForContextMenu(myWebView); 
       return false; 
      } 
     }); 

To działa tylko na łączach, jednak mój menu kontekstowego wyświetla jako pusty prostokąt. Próbowałem używać rzeczywistego widoku OnLongClick, ale nie wydaje się również działać. Nie uważam, że moje Menu kontekstowe jest błędne; działało poza OnLongClick.

@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     getMenuInflater().inflate(R.menu.click, menu); 
    } 

Jak uzyskać prawidłowe wyświetlanie menu? Myślę, że jestem na dobrej drodze, używając HitTestResult onLongClick.

Edit (ODPOWIEDŹ):

myWebView.setOnLongClickListener(new OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       unregisterForContextMenu(myWebView); 
       WebView.HitTestResult result = forumView.getHitTestResult(); 
       if(result.getType() == 7){ 
       registerForContextMenu(myWebView); 


       } 

       return false; 
      } 
     }); 

każdym razem na długi Kliknij ten wyrejestrowanie menu kontekstowego następnie rejestruje go, pojawiały się w menu. Wierzę, że działa to, ponieważ po kliknięciu łącza wyrejestrowuje ono zarejestrowane menu kontekstowe, a następnie decyduje, czy jest to link do menu kontekstowego. Wcześniej nie dałoby to użytkownikowi czasu na wybranie opcji i natychmiast po zarejestrowaniu menu kontekstowego wyrejestruj ją.

+1

Co to jest forumview? – WideFide

+1

forumview == webView :) –

Odpowiedz

0

Właściwie jest to sytuacja byłem napotykając a ostatnio z powodu aplikacji pracuję na - rozwiązanie, które przybył jest zasadniczo taka sama, że ​​wdrożone, tak tutaj jest dobra dla oddawanych:

webView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      unregisterForContextMenu(webView); 
      WebView.HitTestResult result = webView.getHitTestResult(); 
      if (result.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 
       registerForContextMenu(webView); 
      } else { 
       return true; 
      } 

      return false; 
     } 

Należy pamiętać, że za pomocą result.getExtra() można pobrać przefiltrowane wyniki z WebView, w tym przypadku, a HTML::a tag with src=http. Pamiętaj, że ignoruję również inne długie kliknięcia w WebView, zwracając true (obsługiwane).

Powiązane problemy