¿Por qué Android WebView rechaza la entrada del usuario?

Estoy desarrollando una aplicación de Android que usa un WebView para mostrar la página de inicio de sesión de Facebook. La página se carga maravillosamente, y puedo seleccionar los cuadros de texto de nombre de usuario / contraseña, pero escribirlos no funcionará. Es decir, definitivamente tienen un foco de entrada (tienen el recuadro de resaltado de enfoque naranja y un cursor intermitente), pero escribirlos no hace absolutamente nada. No estoy seguro, pero creo que tal vez los botones de formulario también se estén reproduciendo; parecen estar refrescando la página, en lugar de enviar el formulario.

Para ser claros, aunque estoy particularmente interesado en ejecutar Facebook, estoy seguro de que este no es un problema de Facebook, ya que otros sitios web (Google, etc.) también muestran el mismo comportamiento.

¿Alguien tiene alguna idea de lo que podría ser el problema?

Resulta que aparentemente era el WebView sin foco lo que era el problema.

Descubrí que usar las teclas de flecha para enfocarme en las cajas de texto las hacía funcionar, así que teoricé que había un problema en alguna parte con algo que no tenía foco, probablemente la WebView no tenía foco. Efectivamente, agregar la siguiente línea pareció solucionar el problema:

webView.requestFocus(View.FOCUS_DOWN); 

Todavía no entiendo por qué se produjo el problema en primer lugar: los cuadros de texto deberían funcionar tanto si recibían el foco de ser interceptados como a través de una “flecha”, pero al menos tengo una solución que parece funcionar. .

Gracias por su entrada wf.

@Mac tiene esta única línea:

 webView.requestFocus(View.FOCUS_DOWN); 

Resolvió tu problema? No lo hice en mi caso, pero esto sí:

 mWebView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: if (!v.hasFocus()) { v.requestFocus(); } break; } return false; } }); 

solo por su referencia.

Estos son la mayoría tienen

 webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setUseWideViewPort(true); webview.requestFocus(View.FOCUS_DOWN); 

y si aún no funciona, utiliza una alternativa a continuación

Alternativa 1

 webview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: if (!v.hasFocus()) { v.requestFocus(); } break; } return false; } }); 

Alternativa 2

 webview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: v.requestFocusFromTouch(); break; } return false; } }); 

No sé que mi caso es exactamente el mismo que el tuyo,

Descubrí que agregar una línea de css puede resolver el problema.

Solo agrego

 input{ -webkit-user-select: text; } 

para mi CSS, ¡entonces el problema fue resuelto!

Lamento decir que nada de esto funcionó para mí. Supongo que esto depende de tu contexto. En mi caso, el problema ocurrió dentro de un html pop up (div absoluto). Todos los otros campos de entrada estaban bien.

Rompiendo el problema descubrí que es un error en la vista web. Los divs posicionados fijos que contienen otros divs de posición fija / absoluta rompen los campos de entrada en la página. De ahí una regla que redacté para usted (no dude en reformular):

Si en su página tiene un div posicionado fijo con divs nesteds posicionados por defecto (es decir, absoluto, fijo, etc.), cualquiera de los siguientes div posicionados absolutos en su página que contiene campos de entrada obtendrá el comportamiento inesperado.

Por lo tanto, ponga sus campos de entrada en la parte superior de la página (si puede) o evite los divs absolutos nesteds en otros divs fijos / absolutos. Eso debería ayudar.

Publiqué algo al respecto en mi blog si necesita más explicaciones y posibles soluciones: http://java-cerise.blogspot.com/2012/02/android-web-view-inputfields-refuse-to.html

En mi caso, TabHost de un fragmento anterior en la stack posterior estaba robando el foco de la entrada de WebView en cada pulsación de tecla. Así es como lo arreglé:

 tabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { @Override public void onViewDetachedFromWindow(View v) {} @Override public void onViewAttachedToWindow(View v) { tabHost.getViewTreeObserver().removeOnTouchModeChangeListener(tabHost); } }); 

Consulte https://code.google.com/p/android/issues/detail?id=2516 para obtener más información sobre el tema.

No estoy seguro si es el problema, ya que otros sitios web también muestran el mismo comportamiento, pero ¿has habilitado javascript? Un WebView no lo habilita por defecto.

 WebView webView = (WebView)findViewById(R.id.yourWebView); webView.getSettings().setJavaScriptEnabled(true); 

Probé todas las otras soluciones publicadas aquí, ninguna de las cuales funcionó.

En su lugar, amplié WebView y anulé la InputConnection que obligó a KeyEvents a enviar.

 @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { return new BaseInputConnection(this, false); }