47 votes

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

Mon application utilise beaucoup de vues Web réduites en fragments qui sont conservés par un ViewPager.

Chaque fois que je glisse dans l'application sur mon Galaxy Nexus avec Jellybean, je reçois le message suivant de la console 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?

21voto

John Reck Points 191

Le problème se produit parce que dans certains scénarios WebView ne remarque pas que son visible rect a changé, donc autant que webkit est préoccupé de la page n'est pas encore visible. Ainsi, toutes les touches sont à l'extérieur de la fenêtre, et obtenir rejeté.

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

Vous aurez besoin d'une classe de la webview pour promouvoir le protégé onScrollChanged pour une méthode publique.

18voto

Codeversed Points 1418

J'ai eu ce problème précis. 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 changeait, la WebView visible onLongClick fonctionnait à nouveau ... alors je suis venue avec ce petit bijou. En effet c'est très hacky 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);
}
 

16voto

Rahul Dole Points 588

Je me suis confronté exactement au même problème. Dans mon application où que j'ai eu sur les événements codés à l'aide de 'touchend" en jquery bind(), cette erreur est à venir et il l'habitude de ne jamais répondre aux clics (taps).. et a donné une gelée de sens. Alors j'ai essayé de remplacer "touchend" avec "clic" dans bind(), et cela a fonctionné! répondu aux clics (Tap) et aussi à ne pas montrer que l'entrée du journal de webcoreglue..

J'ai aussi trouvé ce bout de code dans Android webview code..

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=%p x=%d y=%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);
}​

et cela aussi..

// 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...

Notez que le message de log-il? Je suppose que ce code est d'identifier les axes x et y des vecteurs générés sur les clics ou les robinets ou de glisse..

1voto

Vlad Kuts Points 66

Ont le même problème avec JellyBean et ViewPager + fragments qui contient des WebViews. Et tout est OK avec le même code en cours d'exécution sur Android 2.2, donc je pense que c'est un bug dans JB WebView mise en œuvre.

Sur JB seulement la première montré fragment avec WebView fonctionne sans erreurs "ne Devrait pas arriver .." dans le journal, et getHitTestResult() appelle renvoie des valeurs correctes. Glisser les pages suivantes, j'ai eu des erreurs dans le journal et getHitTestResult() renvoie uniquement des zéros et les valeurs null.

Maintenant, j'ai trouvé qu'une solution pour créer des fragments avec des conteneurs vides et de créer des WebViews, le programme d'installation qu'ils et de charger des données seulement lorsque le courant fragment devient actif dans le ViewPager. Dans ce cas WebView travaille en tant que de besoin. Mais, malheureusement, cela a complètement pauses une idée de smooth balayage pages dans la ViewPager.

La dernière idée, demain va essayer de remplacer ViewPager de fragments composé de points de vue. Peu de chances, mais je vais vous laisser savoir si les résultats seront couronnés de succès.

0voto

Adam Bubela Points 481

Il est aussi arrivé à moi quand je travaillais dans Cordova + Sencha Touch environnement. Parce que CordovaActivity n'ont pas onScrollChanged() méthode, je ne pouvais pas appliquer aucune des solutions ci-dessus.

Après des heures de cogner ma tête contre le mur, j'ai découvert que certaines parties de l'interface web a été appelé avant c'était complètement rendu. Dans mon cas, ces méthodes ont été déclenchés par activate événement en Ext.PanelView. J'ai remplacé cet événement avec painted et depuis, tout fonctionne comme un charme.

Bien qu'il n'est pas de copier-coller solution j'espère que ça peut aider quelqu'un d'économiser du temps de l'enquête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X