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:
- WebView de Android cargando en blanco al ver listas anidadas html
- Detener evento táctil de ser interceptado por ViewPager si hay evento táctil en la vista web
- La vista web de Android no tratará los eventos correctamente cuando el iframe esté presente
- Desactivar el enlace automático de Webview
- WebView Android "tel:" & "mailto:" enlaces muestran página web no encontrada
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?
- La vista web de Android se aplica demasiado lentamente.
- WebView obtiene bajo ActionBar
- Guardar imagen desde WebView
- Cómo enviar datos POST con código en una vista web de Android
- La pantalla parpadea cuando se utiliza una vista web con flash
- Teclado suave de Android no panorámico vista web
- Error "ABI no admitido" en Chrome Webview
- ¿Cómo descargar archivos de Android de vista web?
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 !!!
- Androide. ¿Cómo funciona el método notifyDataSetChanged () y ListViews?
- Android Studio no puede depurar con error org.gradle.process.internal.ExecException