Android: cómo seleccionar textos de la vista web

Quiero permitir al usuario seleccionar algunos textos de la vista web y debe enviarse como un mensaje de texto. pls encuentra la forma de seleccionar texto y copiar al portapapeles y extraer desde el portapapeles. Vi muchos ejemplos pero nada me ayudó realmente … TIA

Editar
usando el código proporcionado en el enlace de @ orangmoney52 . con los siguientes cambios

el segundo parámetro de getmethod y el segundo parámetro del método de invocación. si doy nulo, vendrá la advertencia … ¿cuál es el correcto?

public void selectAndCopyText() { try { Method m = WebView.class.getMethod("emulateShiftHeld", Boolean.TYPE); m.invoke(BookView.mWebView, false); } catch (Exception e) { e.printStackTrace(); // fallback KeyEvent shiftPressEvent = new KeyEvent(0,0, KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_SHIFT_LEFT,0,0); shiftPressEvent.dispatch(this); } } 

Obteniendo este error:

  05-26 16:41:01.121: WARN/System.err(1096): java.lang.NoSuchMethodException: emulateShiftHeld 

Las respuestas anteriores se ven perfectamente bien y parece que te estás perdiendo algo al seleccionar texto. Por lo tanto, debe verificar el código y encontrar que se ha anulado cualquier TouchEvent de la vista web.

Probé a continuación el código, funciona bien …

La función es

  private void emulateShiftHeld(WebView view) { try { KeyEvent shiftPressEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, 0); shiftPressEvent.dispatch(view); Toast.makeText(this, "select_text_now", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Log.e("dd", "Exception in emulateShiftHeld()", e); } } 

Método Call Above donde lo desee (Puede poner un botón y llamar a este método en su evento click): emulateShiftHeld (mWebView);

Paso: 1 Crea una clase de WebView personalizada. Esta clase anulará la barra de acción nativa al mantener pulsado el texto de la vista web. También maneja el caso de selección para la versión diferente de Android (probado en 4.0 en adelante) Este código toma el texto seleccionado usando javascript.

 public class CustomWebView extends WebView { private Context context; // override all other constructor to avoid crash public CustomWebView(Context context) { super(context); this.context = context; WebSettings webviewSettings = getSettings(); webviewSettings.setJavaScriptEnabled(true); // add JavaScript interface for copy addJavascriptInterface(new WebAppInterface(context), "JSInterface"); } // setting custom action bar private ActionMode mActionMode; private ActionMode.Callback mSelectActionModeCallback; private GestureDetector mDetector; // this will over ride the default action bar on long press @Override public ActionMode startActionMode(Callback callback) { ViewParent parent = getParent(); if (parent == null) { return null; } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { String name = callback.getClass().toString(); if (name.contains("SelectActionModeCallback")) { mSelectActionModeCallback = callback; mDetector = new GestureDetector(context, new CustomGestureListener()); } } CustomActionModeCallback mActionModeCallback = new CustomActionModeCallback(); return parent.startActionModeForChild(this, mActionModeCallback); } private class CustomActionModeCallback implements ActionMode.Callback { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mActionMode = mode; MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.copy: getSelectedData(); mode.finish(); return true; case R.id.share: mode.finish(); return true; default: mode.finish(); return false; } } @Override public void onDestroyActionMode(ActionMode mode) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { clearFocus(); }else{ if (mSelectActionModeCallback != null) { mSelectActionModeCallback.onDestroyActionMode(mode); } mActionMode = null; } } } private void getSelectedData(){ String js= "(function getSelectedText() {"+ "var txt;"+ "if (window.getSelection) {"+ "txt = window.getSelection().toString();"+ "} else if (window.document.getSelection) {"+ "txt = window.document.getSelection().toString();"+ "} else if (window.document.selection) {"+ "txt = window.document.selection.createRange().text;"+ "}"+ "JSInterface.getText(txt);"+ "})()"; // calling the js function if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { evaluateJavascript("javascript:"+js, null); }else{ loadUrl("javascript:"+js); } } private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { if (mActionMode != null) { mActionMode.finish(); return true; } return false; } } @Override public boolean onTouchEvent(MotionEvent event) { // Send the event to our gesture detector // If it is implemented, there will be a return value if(mDetector !=null) mDetector.onTouchEvent(event); // If the detected gesture is unimplemented, send it to the superclass return super.onTouchEvent(event); } 

}

Paso 2: crea una clase separada para la interfaz WebView. Esta clase lista para eventos desde el momento en que se ejecuta el código javascript

 public class WebAppInterface { Context mContext; WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void getText(String text) { // put selected text into clipdata ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("simple text",text); clipboard.setPrimaryClip(clip); // gives the toast for selected text Toast.makeText(mContext, text, Toast.LENGTH_SHORT).show(); } } 

Paso 3: agrega menu.xml para el menú personalizado en la carpeta res> menú

 < ?xml version="1.0" encoding="utf-8"?>      

Tomé la ayuda de varios enlaces que figuran a continuación para lograr esto: Gracias a ustedes, chicos.

cómo usar javascript en la vista web http://developer.android.com/guide/webapps/webview.html#UsingJavaScript

para inyectar javascript ¿Por qué no puedo insertar este javascript en la vista web en android?

para anular la barra de acciones predeterminada ¿Cómo anular la selección de texto predeterminada de android webview os 4.1+?

para la versión 4.0. a la selección de texto 4.3 Selección de texto de vista web que no se borra

La forma más sencilla, aunque no tan bonita como lo que parece ser una función de copiar / pegar implementada por el fabricante, es la siguiente:

https://bugzilla.wikimedia.org/show_bug.cgi?id=31484

Básicamente, si configura su propio WebChromeClient través de webview.setWebChromeClient(...) , la selección de texto está deshabilitada de manera predeterminada. Para habilitarlo, su WebChromeClient debe tener el siguiente método implementado:

 //@Override /** * Tell the client that the selection has been initiated. */ public void onSelectionStart(WebView view) { // Parent class aborts the selection, which seems like a terrible default. //Log.i("DroidGap", "onSelectionStart called"); } 

@ vnshetty, usando el código provisto en el enlace de @ orangmoney52, pude completar este problema hace unos meses. Puede crear un botón en su menú que le permita copiar texto. Luego, en onOptionsItemSelected, puede tener una cláusula como esta:

  case R.id.select_and_copy: { Toast.makeText(getApplicationContext(), "Select Text", Toast.LENGTH_SHORT).show(); selectAndCopyText(); return true; }