2015-12-07 15 views
9

sto creando una WebView "galleggiante" in questo modo:Come selezionare e copiare il testo in una vista non collegata a un'attività?

public class MyService extends Service { 
    public static WindowManager windowManager; 
    public static LinearLayout mainView; 
    public WebView webView; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 

     // main view 
     mainView = (LinearLayout) inflater.inflate(R.layout.popup, null); 
     WindowManager.LayoutParams mainViewParams = new WindowManager.LayoutParams(
       LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
       PixelFormat.TRANSLUCENT); 

     windowManager.addView(mainView, mainViewParams); 

     // main view - web views 
     webView = (WebView) mainView.findViewById(R.id.webView1); 
     webView.setWebViewClient(new WebViewClient()); 
    } 
} 

La vista principale è un LinearLayout che contiene un WebView. La vista principale viene visualizzata quando viene creato il servizio ed è non collegato a in qualsiasi attività. La vista può fluttuare sopra altre attività grazie al flag WindowManager.LayoutParams.TYPE_PHONE.

Il problema è che non riesco a selezionare alcun testo visualizzato in WebView. Se tengo il mio tocco su una parola, la selezione appare quindi scompare molto rapidamente. La barra delle azioni per copiare testo, ecc. Non viene visualizzata, né il menu di scelta rapida in Marshmallow.

Accade perché la mia vista non è collegata a un'attività? Ho usato per implementare la mia vista mobile utilizzando un'attività e la selezione del testo ha funzionato bene, ma di recente ho cambiato l'approccio "nessuna attività" poiché non voglio dover gestire tutta la gestione del ciclo di vita delle attività non necessarie quando mostro/nascondi il vista.

Come posso recuperare la selezione del testo (nella mia WebView)?

EDIT: questo problema non è specifico di WebView. Ho aggiunto un EditText alla vista principale e non posso selezionare il testo da esso.

MODIFICA 2: Ecco un esempio di progetto che illustra il problema: https://github.com/chinhodado/floating_test. Quando lo esegui, vedrai che è impossibile selezionare e copiare il testo da EditText e WebView.

+0

vuoi selezionare il testo da webview ?? –

+0

Sì, giusto – Chin

+1

http://stackoverflow.com/questions/6058843/android-how-to-select-texts-from-webview http://stackoverflow.com/questions/10448717/android-text-selection-in- webview –

risposta

0

Si discute molto sulla domanda se è possibile creare viste da un servizio. Il problema è che non puoi avere la piena funzionalità e questo è probabilmente il problema che stai affrontando in questo momento con il testo non selezionabile o copiabile. Sono relativamente sicuro perché i callback non sono registrati su un'istanza in esecuzione di un'attività.

Come indicato in una risposta in questa domanda la creazione di una vista da un servizio è "contro linee guida di Google"

How to display a Dialog from a Service

Qui le persone stanno discutendo su di esso, ma alla fine questo è in realtà CONTRO linee guida di Google. Puoi provare a farlo funzionare, ma la tua app non arriverà sul Play Store.

Starting a View from a Service?

Se leggete anche questo: https://developer.android.com/reference/android/view/View.html

Troverete che avete bisogno di un "albero di punti di vista", che è di solito attribuita ad un'attività di avere funzionalità

Una volta che avete creato un albero di visualizzazioni, ci sono in genere alcuni tipi di operazioni comuni che si desidera eseguire:

Impostare le proprietà: per e xample imposta il testo di una TextView. Le proprietà disponibili e i metodi che li impostano variano tra le diverse sottoclassi di visualizzazioni. Si noti che le proprietà note al momento della compilazione possono essere impostate nei file di layout XML.

Messa a fuoco: il framework gestirà lo spostamento dello stato attivo in risposta all'input dell'utente. Per forzare l'attivazione su una vista specifica, chiama requestFocus().

Impostare listener: Views consente ai client di impostare i listener che verranno avvisati quando accade qualcosa di interessante alla vista. Ad esempio, tutte le viste ti permetteranno di impostare un ascoltatore da notificare quando la vista ottiene o perde attenzione. È possibile registrare un listener di questo tipo utilizzando setOnFocusChangeListener (android.view.View.OnFocusChangeListener). Altre sottoclassi di view offrono listener più specializzati. Ad esempio, un pulsante espone un listener per notificare i client quando si fa clic sul pulsante.

Imposta visibilità: È possibile nascondere o mostrare le visualizzazioni utilizzando setVisibility (int).

Buona giornata.

Problemi correlati