Android WebView JellyBean -> Ne devrait pas se produire: aucun noeud de test basé sur recto n’a été trouvé

Mon application utilise beaucoup de consultations Web qui se trouvent dans des fragments détenus par un ViewPager.

Chaque fois que je passe à travers l’application sur mon Galaxy Nexus avec Jellybean, j’obtiens le message de console suivant encore et encore:

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

Quelqu’un peut-il m’expliquer ce qui ne va pas ici pour que je puisse résoudre le problème?

Le problème se produit car, dans certains scénarios, WebView ne remarque pas que son rectangle visible a été modifié. En ce qui concerne webkit, la page n’est toujours pas visible. Ainsi, toutes les touches tombent en dehors de la fenêtre et sont rejetées.

Le correctif le plus propre est lorsque vous savez que la visibilité de votre WebView a changé (par exemple, en réponse à un rappel setPrimaryItem depuis un viewpager), appelez webview.onScrollChanged(webview.getScrollX(), webview.getScrollY());

Vous devrez sous-classer la vue Web pour promouvoir le onScrollChanged protégé sur une méthode publique.

J’ai eu ce problème exact. Le problème est exactement ce que Rahul Dole a dit dans sa réponse ci-dessus.

Je passe quelques jours à essayer des tonnes de choses différentes. J’ai remarqué que lorsque l’orientation a changé, le WebView onLongClick visible a encore fonctionné … alors j’ai trouvé ce petit bijou. En effet c’est très pirate mais ça marche!

Utilisez ceci dans votre classe qui étend 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); } 

J’ai fait face exactement au même problème. Dans mon application, partout où des événements de clic étaient codés à l’aide de ‘touchend’ dans jquery bind (), cette erreur arrivait et elle ne répondait jamais aux clics (taps) .. et donnait une impression figée. Donc j’ai juste essayé de remplacer ‘touchend’ avec ‘click’ dans bind (), et ça a fonctionné! répondu aux clics (Taps) et n’a pas non plus montré cette entrée de journal de webcoreglue ..

J’ai aussi trouvé ce morceau de code dans le code de navigation Web d’Android.

 HTMLElement* WebViewCore::resortingeveElement(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 >& 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() : ""); return static_cast(element); }​ 

et cela aussi ..

 // get the highlight rectangles for the touch point (x, y) with the slop Vector WebViewCore::getTouchHighlightRects(int x, int y, int slop) { Vector 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 >& 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... 

Notez que le message de journal est là? Je suppose que ce code sert à identifier les vecteurs des axes x et y générés sur les clics, les taps ou les balayages.

Vous rencontrez le même problème avec les fragments JellyBean et ViewPager + qui contiennent des WebViews. Et tout va bien avec le même code sous Android 2.2, donc je pense que c’est un bogue dans l’implémentation de JB WebView.

Sur JB, seul le premier fragment affiché avec WebView fonctionne correctement, sans erreurs “Ne devrait pas se produire ..” dans le journal, et les appels getHitTestResult () renvoient des valeurs correctes. En passant aux pages suivantes, j’ai des erreurs dans le journal et getHitTestResult () ne renvoie que des zéros et des null.

Maintenant, j’ai trouvé une seule solution pour créer des fragments avec des conteneurs vides et créer des WebViews, les configurer et charger des données uniquement lorsque le fragment actuel devient actif dans ViewPager. Dans ce cas, WebView fonctionne selon les besoins. Mais, malheureusement, cela brise complètement une idée de glisser des pages en douceur dans ViewPager.

Ayez la dernière idée: demain, essayez de remplacer les fragments de ViewPager par des vues composées. Peu de chances, mais je vous ferai savoir si les résultats seront positifs.

Ne sais pas pourquoi cela a fonctionné. J’ai ajouté le programme d’écoute onTouchEvent dans mon fichier MainActivity.java pour résoudre ce problème.

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

Cela m’est également arrivé lorsque je travaillais dans l’environnement Cordova + Sencha Touch. Parce que CordovaActivity n’a rien comme la méthode onScrollChanged() , je n’ai pu appliquer aucune des solutions ci-dessus.

Après des heures à me cogner la tête contre le mur, j’ai découvert que certaines parties de l’interface Web avaient été appelées avant d’être complètement rendues. Dans mon cas, ces méthodes ont été déclenchées par activate événement dans Ext.PanelView . J’ai remplacé cet événement par de la painted et depuis, tout fonctionne comme un charme.

Bien que ce ne soit pas une solution de copier-coller, j’espère que cela peut aider quelqu’un à gagner du temps lors des enquêtes.

Une autre solution:

Vous n’avez pas besoin d’étendre la classe WebView pour résoudre ce problème. J’ai résolu ce problème en ajoutant les deux lignes suivantes juste après avoir chargé le contenu de la vue 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); 

J’espère que cela aidera (j’ai testé moi-même et cela a fonctionné).

À votre santé

J’ai même WebView dans ViewPager, et j’ai résolu ce problème en onTouchEvent() en étendant la classe webview.

Voici mon code:

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

À votre santé !!!