2012-01-13 14 views
5

Se sabe que es difficult para obtener el texto seleccionado en una vista Web porque la selección de texto de WebView es manejada por una clase privada, WebTextView.Obtención del texto seleccionado en una vista Web a través de una barra de acción contextual

Sin embargo, con el recientemente lanzado Android 4.0 Design guidelines, parece haber un rayo de esperanza de lograr esto a través de barras de acción contextual (CAB). Es says:

Utilice CAB siempre que permita al usuario seleccionar los datos mediante la pulsación prolongada. Puede controlar el contenido de acción de un CAB para insertar las acciones que le gustaría que el usuario pudiera realizar.

¿Estoy malinterpretando esto? ¿Hay alguna forma de recuperar el texto seleccionado de un WebView a través de un CAB?

Después de un largo clic y el modo de selección de texto comienza, actualmente puedo detectar cuando el ActionMode se inicia y modifica el original copiar/pegar Menu; sin embargo, no puedo entender cómo recuperar el texto seleccionado.

+0

Hola, @octopi, ¿podría decirme cómo detecta realmente cuándo se inicia ActionMode y cómo ha modificado el menú? Lo que logré es detectar un clic largo e iniciar el Modo de Acción por mí mismo, proporcionando una barra personalizada a través de 'ActionMode.Callback', pero eso no mostrará los cursores de selección de texto. – davids

+0

@davids. Sin decir la selección, también quiero saber cómo desertar o modificar el menú. Tengo una solución bastante desagradable si no necesitas usar 'ActionMode' que no sea la selección de texto. Anulo el 'actionMode público OnWindowStartingActionMode (ActionMode.Callback callback)' en la actividad. Diga 'return super.onWindowStartingActionMode (new MyActionModeCallback());'. Funciona y los cursores no desaparecen. Sin embargo, no sé qué efecto secundario podría causar esta solución. Puedo pensar que el sistema no quiere que lo hagamos. – Yeung

+0

@Yeung también tengo una necesidad de anular la barra de acciones, pero necesito el identificador de selección – Ravi

Respuesta

8

No puede hacer eso con la API actual.

que presentaron una solicitud de función para este - Edición 24841: WebView debe permitir que las aplicaciones proporcionan una costumbre contextuales Barra de acción http://code.google.com/p/android/issues/detail?id=24841

Básicamente, en vista Web 4.0 ha hardcoded su propia barra de acciones contextuales (CAB). Ese CAB tiene una referencia de regreso a WebView y con esa referencia, puede obtener el texto seleccionado. No estoy seguro de cómo fue posible detectar el Modo de Acción al iniciar y modificar el menú, pero si pudo hacer todo eso, entonces está atascado porque getSelection() es actualmente paquete privado. Lo presenté como un tema separado y lo relacioné con el anterior número anterior.

+0

¿Todavía no hay solución para esto? – clu

0

Puede usar javascript para obtener el texto seleccionado: window.getSelection(), y usar la función addJavascriptInterface de WebView para devolver el resultado.

+1

Eso no funcionará. Por favor, lea la pregunta original – johnoodles

+0

@johnnoodles ¿Estás seguro?Actualmente uso algo como lo siguiente para obtener el texto seleccionado en un WebView: 'wvWebView.loadUrl (" javascript: if0.textOut (document.getSelection(). ToString()); ");' donde 'if0' es un JavaScriptInterface con un método 'textOut (String s)'. Funciona bien para mí (aunque todavía tengo otros problemas): ¿esto rompe alguna parte de la funcionalidad solicitada que me he perdido? ¿El problema es que este método no es estrictamente a través del CAB? – Erhannis

0

gracias por su información, he resuelto un problema difícil .. Solo quiero agregar alguna función en el modo de acción. El siguiente es mi código, puede ser útil para otros.

@Override 
public ActionMode onWindowStartingActionMode(Callback callback) { 
    // TODO Auto-generated method stub 
    ActionMode mode = super.onWindowStartingActionMode(callback); 
    mode.getMenuInflater().inflate(R.menu.actions, mode.getMenu()); 
    mode.getMenu().findItem(R.id.action_add).setOnMenuItemClickListener(new OnMenuItemClickListener() { 

     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
      // TODO Auto-generated method stub 
      Log.i("", "onMenuItemClick add "); 
      return false; 
     } 
    }); 
    return mode; 
} 
+0

Wing Chen, la respuesta está fuera de contexto. Por favor lea la pregunta real. – Adnan

Cuestiones relacionadas