Me encontré con este problema recientemente y en mi caso me las arreglé para descubrir que una corrección secundaria de errores estaba causando este problema.
Por lo tanto, si no creó una clase personalizada que extienda la vista web, eso anula onCheckIsTextEditor para que siempre devuelva verdadero debido a una sugerencia en este android bug report ... Dejaría de leer aquí.
Si lo ha hecho, parece que esta solución ya ha sido implementada por HTC y por algún motivo hace que se bloquee cuando recibe el foco. Este problema se manifestó en dos lugares para mí, al colocar eventos táctiles en la vista y al establecer la visibilidad de las vistas. En mi proyecto, establecí un WebViewClient y esperé hasta que la página terminara de cargar antes de configurar la visibilidad de la vista web como visible. Esto hizo que el seguimiento de pila:
java.lang.NullPointerException at android.webkit.WebView.navHandledKey(WebView.java:9353)
at android.webkit.WebView.requestFocus(WebView.java:7910)
at android.view.View.requestFocus(View.java:3718)
at android.view.View.requestFocus(View.java:3696)
at android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1803)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.View.setFlags(View.java:4680)
at android.view.View.setVisibility(View.java:3163)
Al envolver la llamada setVisibility en un try/catch yo era capaz de determinar si debería anular los eventos de toque o no. Si cogí el evento, eso significaría que debería desactivar la anulación. Este es un ejemplo de lo que hice:
try {
webView.setVisibility(View.VISIBLE);
} catch (NullPointerException e) {
Log.i(TAG, "Error setting webview visibility due to overriding focus. It will be disabled.");
webView.setOverrideOnCheckIsTextEditor(false);
// Confirm window is visible
webView.setVisibility(View.VISIBLE);
}
Mi vista web personalizada ahora se ve así, especial atención a los dos últimos métodos:
/**
* When using a webview in a dialog, there are issues relating to the keyboard not appearing when focusing on a text box.
* This overrides a function to ensure the keyboard is shown when focusing on a text box in a webview.
* See link for bug report and solution.
*
* @see http://code.google.com/p/android/issues/detail?id=7189
* @see http://stackoverflow.com/questions/12325720
* @author James O'Brien
* @since 10/16/2012
*/
public class FocusableWebView extends WebView {
private boolean mOverrideCheckIsTextEditor = true;
/**
* Default Constructor
*
* @param context
*/
public FocusableWebView(Context context) {
super(context);
}
/**
* Default Constructor
*
* @param context
* @param attrs
*/
public FocusableWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Default Constructor
*
* @param context
* @param attrs
* @param defStyle
*/
public FocusableWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onCheckIsTextEditor() {
if (mOverrideCheckIsTextEditor) {
return true;
} else {
return super.onCheckIsTextEditor();
}
}
/**
* Enable/Disable overriding of onCheckIsTextEditor to always return true.
*/
public void setOverrideOnCheckIsTextEditor(boolean foo) {
mOverrideCheckIsTextEditor = foo;
}
}
Lo siento, no puedo entrar en más detalles acerca por qué esto soluciona el problema Todo lo que puedo suponer es que su relación con el enfoque y la desactivación de forma dinámica funciona una delicia :)
** Actualización (12/11/12) **
logrado resolver ambos problemas presentados anteriormente. Parecía ser un problema con el enfoque de la vista web. Mi código se verá así
webView.setVisibility(View.VISIBLE);
webView.setFocusable(true);
webView.requestFocus();
Yo sugeriría asegurándose de que se establezca explícitamente el atributo enfocable a 'verdadero' o llamando setFocusable (verdadero).
¿Algún patrón para los lanzamientos de Android o fabricantes de dispositivos? – CommonsWare
¡Interesante observación! ¡Parece estar confinado a dispositivos HTC! – PacificSky
He agregado la etiqueta HTC, ya que existe la posibilidad de que reciba asistencia de HTC. Supongo que no tiene un caso de prueba reproducible, ¿correcto? – CommonsWare