Android WebView JellyBean -> No debería suceder: no se encontraron nodos de pruebas basadas en rect

Mi aplicación está utilizando una gran cantidad de webviews que se encuentran en fragmentos que están sujetos por un ViewPager.

Cada vez que paseo a través de la aplicación en mi Galaxy Nexus con Jellybean en él consigo el siguiente mensaje de la consola una y otra vez:

08-23 13:44:03.374: E/webcoreglue(21690): Should not happen: no rect-based-test nodes found 

¿Puede alguien explicarme qué es lo que está mal aquí para que pueda ser capaz de solucionar el problema?

El problema se produce porque en algunos escenarios WebView no se da cuenta de que su rect visible ha cambiado, por lo que en lo que a webkit se refiere la página sigue sin ser visible. Así, todos los toques caen fuera de la ventana y se rechazan.

La solución más limpia es cuando se sabe que la visibilidad de su WebView ha cambiado (por ejemplo, en respuesta a una devolución de llamada setPrimaryItem desde un viewpager), llame a webview.onScrollChanged(webview.getScrollX(), webview.getScrollY());

Necesitará subclasificar la webview para promover el onScrollChanged protegido a un método público.

Tenía este problema exacto. El problema es exactamente lo que dijo Rahul Dole en su respuesta anterior.

Me paso unos días en este intento toneladas de cosas diferentes. Me di cuenta de que cuando la orientación cambió que el visible WebView onLongClick funcionó de nuevo … por lo que se me ocurrió esta pequeña joya. De hecho, es muy hacky, pero funciona!

Utilice esto en su clase para extender WebView:

 @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN){ int temp_ScrollY = getScrollY(); scrollTo(getScrollX(), getScrollY() + 1); scrollTo(getScrollX(), temp_ScrollY); } return super.onTouchEvent(event); } 

Me enfrenté exactamente al mismo problema. En mi aplicación dondequiera que tenía eventos de clic codificados utilizando 'touchend' en jquery bind (), este error se acercaba y se utiliza para nunca responder a los clics (grifos) .. y dio un tipo congelado de sentir. Así que sólo trató de reemplazar 'touchend' con 'clic' en bind (), y funcionó! Respondió a los clics (Taps) y tampoco mostró esa entrada de registro de webcoreglue ..

También encontré este fragmento de código en el código de webview de Android.

 HTMLElement* WebViewCore::retrieveElement(int x, int y, const QualifiedName& tagName) { HitTestResult hitTestResult = m_mainFrame->eventHandler() ->hitTestResultAtPoint(IntPoint(x, y), false, false, DontHitTestScrollbars, HitTestRequest::Active | HitTestRequest::ReadOnly, IntSize(1, 1)); if (!hitTestResult.innerNode() || !hitTestResult.innerNode()->inDocument()) { LOGE("Should not happen: no in document Node found"); return 0; } const ListHashSet<RefPtr<Node> >& list = hitTestResult.rectBasedTestResult(); if (list.isEmpty()) { LOGE("Should not happen: no rect-based-test nodes found"); return 0; } Node* node = hitTestResult.innerNode(); Node* element = node; while (element && (!element->isElementNode() || !element->hasTagName(tagName))) { element = element->parentNode(); } DBG_NAV_LOGD("node=%p element=%px=%dy=%d nodeName=%s tagName=%s", node, element, x, y, node->nodeName().utf8().data(), element ? ((Element*) element)->tagName().utf8().data() : "<none>"); return static_cast<WebCore::HTMLElement*>(element); }​ 

y esto también..

 // get the highlight rectangles for the touch point (x, y) with the slop Vector<IntRect> WebViewCore::getTouchHighlightRects(int x, int y, int slop) { Vector<IntRect> rects; m_mousePos = IntPoint(x - m_scrollOffsetX, y - m_scrollOffsetY); HitTestResult hitTestResult = m_mainFrame->eventHandler()->hitTestResultAtPoint(IntPoint(x, y), false, false, DontHitTestScrollbars, HitTestRequest::Active | HitTestRequest::ReadOnly, IntSize(slop, slop)); if (!hitTestResult.innerNode() || !hitTestResult.innerNode()->inDocument()) { LOGE("Should not happen: no in document Node found"); return rects; } const ListHashSet<RefPtr<Node> >& list = hitTestResult.rectBasedTestResult(); if (list.isEmpty()) { LOGE("Should not happen: no rect-based-test nodes found"); return rects; } //Rest of the part is omitted here... 

¿Observe ese mensaje de registro allí? Supongo que este código es para identificar los vectores de eje xyy generados en clics o taps o swipes.

Tiene el mismo problema con los fragmentos JellyBean y ViewPager + que contiene WebViews. Y todo bien con el mismo código que se ejecuta en Android 2.2, por lo que creo que esto es un error en la implementación de JB WebView.

En JB sólo el primer fragmento mostrado con WebView funciona correctamente, sin errores "No debería suceder .." en el registro, y getHitTestResult () devuelve las llamadas correctas valores. Pasando a las páginas siguientes, tengo errores en el registro y getHitTestResult () devuelve sólo ceros y nulos.

Ahora sólo encontré una solución para crear fragmentos con contenedores vacíos y crear WebViews, configurarlos y cargar datos sólo cuando el fragmento actual se active en ViewPager. En este caso, WebView funciona según sea necesario. Pero, por desgracia, esto rompe completamente una idea de deslizamiento suave páginas en el ViewPager.

Tenga la última idea, mañana intentará reemplazar fragmentos de ViewPager a vistas compuestas. Pocas posibilidades, pero te haré saber si los resultados serán exitosos.

No tengo ni idea de por qué funcionó. He añadido el oyente onTouchEvent a mi MainActivity.java para solucionar este problema.

 public class MainActivity extends ActionBarActivity implements ActionBar.TabListener { public class MyWebView extends WebView { public MyWebView(Context context) { super(context); } public MyWebView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { onScrollChanged(getScrollX(), getScrollY(), getScrollX(), getScrollY()); return super.onTouchEvent(event); } } 

También me pasó a mí cuando trabajaba en el entorno de Cordova + Sencha Touch. Como CordovaActivity no tiene nada como el método onScrollChanged() , no podría aplicar ninguna de las soluciones anteriores.

Después de horas de golpear mi cabeza contra la pared descubrí que algunas partes de la interfaz web había sido llamado antes de que este se procesó completamente. En mi caso, esos métodos fueron desencadenados por activate evento en Ext.PanelView . He reemplazado ese evento con painted y desde entonces todo funciona como un encanto.

Aunque no es una solución de copiar y pegar, espero que ayude a alguien a ahorrar tiempo en la investigación.

Otra solución:

No necesitas extender la clase WebView para arreglar eso. Tengo que fijar agregando las dos líneas siguientes justo después de cargar el contenido de la vista web (myWebView.loadUrl ("…"):

 wv.loadUrl("your url here"); //Add the following two lines myWebView.scrollTo(myWebView.getScrollX(), myWebView.getScrollY()+1); myWebView.scrollTo(myWebView.getScrollX(), myWebView.getScrollY()-1); 

Espero que esto ayude (me probé y funcionó).

Aclamaciones

Incluso tengo WebView dentro de un ViewPager, y solucionado este problema anulando onTouchEvent() extendiendo la clase de webview.

Aquí está mi código:

 @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { requestFocusFromTouch(); } return super.onTouchEvent(event); } 

Saludos !!!

  • Cómo desactivar el efecto de rebote (tono azul cuando se desplaza hasta el final) de la vista web en android?
  • Cómo cambiar el FontSize en un WebView de Android?
  • ¿Cómo capturar esta excepción en la vista web de Android?
  • ¿Por qué el atributo minHeight no funciona en WebView Android?
  • Hacer el epub libro en android?
  • Android WebView no está cargando el sitio web en caché si no hay conexión
  • Android - Añadir GestureDetector a la vista web
  • Android WebView getElementById ('math') no funciona dinámicamente
  • Android Cómo mostrar vínculos en la vista web de esta manera?
  • Las transmisiones en directo de Youtube en la vista web de Android son nerviosas
  • cómo leer el archivo .webarchive en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.