2013-06-15 6 views
11

Analogamente ad altri browser come Chrome e Firefox, ho bisogno che l'utente faccia un lungo clic su un collegamento quindi mostri un menu contestuale, ma se fanno un lungo clic su qualcosa e non è un collegamento, non fanno nulla.WebView Android, l'impostazione del clic lungo è abilitata sui collegamenti esclusivamente?

L'utilizzo di registerForContextMenu(myWebView); consente di fare clic su qualsiasi oggetto che non desidero. Pertanto, penso che sia necessario filtrare gli oggetti da registerForContextMenu(myWebView); o analizzare l'html per i collegamenti che sembra eccessivo. Ho anche provato l'override shouldOverrideUrlLoading metodo:

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

Ho guardato questa discussione Enable longClick in WebView ma non mi ha aiutato. Ho provato a implementarlo ma ho una forza vicina.

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

Infine ho provato a HitTestResult, Questo è probabilmente il migliore che abbia avuto modo di risolvere il problema.

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

Questo funziona solo sui collegamenti, tuttavia il mio menu contestuale visualizzato come un rettangolo vuoto. Ho provato a utilizzare la vista OnLongClick effettiva, ma non sembra funzionare neanche. Non penso che il mio menu contestuale sia sbagliato; ha funzionato all'esterno di OnLongClick.

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

Come visualizzare correttamente il menu? Penso di essere sulla strada giusta usando HitTestResult onLongClick.

Edit (RISPOSTA):

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

Ogni volta a Long Fare clic su questo annulla la registrazione del menu di scelta rapida, allora lo registra, spuntando il menu. Credo che funzioni perché non appena si fa clic su un collegamento, si annulla la registrazione del menu di scelta rapida registrato e quindi si decide se si tratta di un collegamento per visualizzare il menu di scelta rapida. In precedenza, non concedeva all'utente la possibilità di scegliere un'opzione e, subito dopo aver registrato il menu di scelta rapida, annullarne la registrazione.

+1

Che cos'è forumview? – WideFide

+1

forumview == webView :) –

risposta

0

Questo è in realtà una situazione che stavo arrivando attraverso piuttosto ultimamente a causa di un app ho lavorato sul - la soluzione che si arrivò a è essenzialmente la stessa che ho implementato, così qui è per amor completamenti:

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

Si noti che utilizzando result.getExtra() si recupereranno i risultati filtrati da WebView, in questo caso a HTML::a tag with src=http. Nota che ignoro anche altri lunghi clic sul WebView restituendo true (gestito).

Problemi correlati