2013-03-12 10 views
27

Desidero sovrascrivere la BAR (Contextual Actionual Bar) predefinita esistente per la selezione del testo. Voglio dire, voglio mostrare il mio CAB, con i miei pulsanti, quando viene selezionato del testo sulla webview. Ho provato ad implementare un CAB usando la documentazione di Android. OnLongClickListener non acquisisce l'evento di selezione del testo nella visualizzazione Web. Qual è l'evento che cattura la selezione del testo? È possibile nascondere il CAB predefinito e visualizzare il mio CAB sulla selezione del testo?Sovrascrittura della barra azioni contestuali predefinita per la selezione del testo (in WebView) in Android

childWebView.setOnLongClickListener(new OnLongClickListener() { 
     @Override 
    // Called when the user long-clicks on someView 
     public boolean onLongClick(View view) { 
      if (mActionMode != null) { 
       return false; 
      } 

      // Start the CAB using the ActionMode.Callback defined above 
      mActionMode = startActionMode(mActionModeCallback); 
      view.setSelected(true); 
      return true; 
     } 
    }); 
+0

hai trovato una soluzione per quel karka? –

+0

No. Non l'ho fatto – arun8

+0

qualsiasi soluzione fino ad ora? – sanjeev

risposta

8

Sono stato in grado di risolvere questo. Stavo anche affrontando questo problema e non sono riuscito a trovare alcuna soluzione sul web.

Quindi, se si imposta un listener LongClick, la visualizzazione Web smetterebbe di mostrare la selezione. Dopo aver approfondito il codice di Webview, ho scoperto che stava chiamando il metodo StartRunMode di WebView e passando un'istanza della classe SelectActionCallbackMode.

ho semplicemente esteso la classe Webview e overrided il metodo startRunMode in questo modo:

public ActionMode startActionMode(ActionMode.Callback callback) 
{ 
    actionModeCallback = new CustomizedSelectActionModeCallback(); 
    return super.startActionMode(actionModeCallback); 
} 

Ciò ha costretto il Webview per visualizzare la mia richiamata invece di visualizzare di default di Webview uno. Ciò ha assicurato che la selezione funzionasse senza problemi come prima e che il mio CAB fosse visualizzato ogni volta che veniva effettuata la selezione. L'unico avvertimento era che dovevo scrivere un codice per licenziare il CAB da solo.

Testato su dispositivi 4.1, 4.2 e 4.3.

Spero che questo aiuti.

+0

grazie, funziona per me – mohitum

+0

Ma non è possibile ottenere il testo selezionato dalla visualizzazione Web. Inoltre, nella mia implementazione a volte ho un errore interno nella webview di Kitkat, usando questo approccio. – Frank

+0

@Frank È possibile ottenere il testo selezionato tramite JavaScript (window.getSelection(). ToString()). Non l'ho ancora provato su KitKat, cercherò di dare un'occhiata al problema. –

1

La documentazione ufficiale Selection | Android Developers note:

selezione delle azioni CAB

Si può decidere quali azioni e gli elementi appaiono in cabina. Utilizzare le linee guida nello Action Bar pattern per decidere quali articoli aggiungere a superficie al livello superiore e quali spostare sull'overflow dell'azione.

dinamicamente regolare le azioni CAB Nella maggior parte dei casi è necessario regolare le azioni in cabina in modo dinamico come l'utente aggiunge altri elementi alla selezione. Le azioni che si applicano a un singolo elemento di dati selezionato non si applicano necessariamente a più elementi di dati selezionati dello stesso tipo.

Sfortunatamente, il collegamento incluso nella citazione rimanda a una sezione che contiene anche solo informazioni generali senza entrare effettivamente nei dettagli. Per peggiorare le cose, si ricollega alla pagina Selection | Android Developers.

Guardando un po 'oltre, ho trovato this tutorial da Lars Vogel. Cito (miniera di formattazione):

Una modalità di azione contestuale attiva una temporanea ActionBar che si sovrappone l'applicazione ActionBar per la durata di un particolare sub-task.

La modalità di azione contestuale viene in genere attivata selezionando un elemento o facendo clic su di esso.

Per implementare ciò, chiamare il metodo startActionMode( in una vista o su l'attività. Questo metodo ottiene un oggetto ActionMode.Callback che è responsabile del ciclo di vita del ActionBar contestuale.

È anche possibile assegnare un menu di scelta rapida a View tramite il metodo registerForContextMenu(view). Un menu di scelta rapida viene attivato anche se l'utente "preme a lungo" la vista. Il metodo onCreateContextMenu() viene chiamato ogni volta che viene attivato un menu di scelta rapida mentre il menu di scelta rapida viene eliminato dopo l'utilizzo. Si dovrebbe preferire la modalità contestuale per l'utilizzo dei menu di scelta rapida.

I riferimenti di riferimento più importanti che possiamo creare il nostro menu utilizzando registerForContextMenu(view). Piuttosto che duplicare una risposta, ho trovato this answer per J. Pablo Fernández che contiene un esempio di codice su come applicare il proprio CAB. La registrazione di un nuovo menu di scelta rapida dovrebbe ignorare qualsiasi menu predefinito, ma non sono sicuro.Poiché non sono in grado di testare questo momento, sarei lieto di sapere se questo ha risolto il tuo problema.

Problemi correlati