wake-up-neo.net

Android WebView JellyBean -> Sollte nicht passieren: Es wurden keine rektbasierten Testknoten gefunden

Meine Anwendung verwendet viele Webviews, die in Fragmenten liegen, die von einem ViewPager gehalten werden. 

Immer wenn ich auf meinem Galaxy Nexus mit Jellybean durch die App streife, erhalte ich immer wieder die folgende Konsolenmeldung: 

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

Kann mir jemand erklären, was hier schief läuft, damit ich das Problem beheben kann? 

47
Ostkontentitan

Das Problem tritt auf, weil WebView in einigen Szenarien nicht bemerkt, dass sich das sichtbare Problem geändert hat. Daher ist die Seite nach wie vor nicht sichtbar. Somit fallen alle Berührungen aus dem Fenster und werden zurückgewiesen.

Das sauberste Update ist, wenn Sie wissen, dass sich die Sichtbarkeit Ihres WebView geändert hat (z. B. als Antwort auf einen setPrimaryItem-Callback von einem Viewpager). Rufen Sie webview.onScrollChanged(webview.getScrollX(), webview.getScrollY()); auf. 

Sie müssen die Webansicht subclassieren, um das protected onScrollChanged zu einer öffentlichen Methode zu machen.

21
John Reck

Ich hatte genau dieses Problem. Das Problem ist genau das, was Rahul Dole in seiner obigen Antwort gesagt hat. 

Ich verbringe ein paar Tage damit, viele verschiedene Dinge auszuprobieren. Ich bemerkte, dass bei einer Änderung der Ausrichtung das sichtbare WebView onLongClick wieder funktionierte ... also kam mir dieses kleine Juwel. Es ist zwar sehr hackig, aber es funktioniert!

Verwenden Sie dies in Ihrer Klasse, die WebView erweitert:

@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);
}
18
Codeversed

Ich stand genau dem gleichen Problem gegenüber. Wo immer ich Klickereignisse mit "touchend" in jquery bind () codiert hatte, wurde dieser Fehler angezeigt, und er reagierte nie auf Klicks (Taps) Ich habe gerade versucht, 'touchend' durch 'click' in bind () zu ersetzen, und es hat funktioniert! hat auf Klicks (Taps) geantwortet und auch diesen Protokolleintrag von webcoreglue nicht angezeigt. 

Ich habe dieses Stück Code auch im Webview-Code von Android gefunden.

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);
}​

und das auch..

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

Beachten Sie die Log-Nachricht dort? Ich vermute, dieser Code dient zum Identifizieren der x- und y-Achsenvektoren, die bei Klicks oder Taps oder Wischen erzeugt werden ... _. Das

16
Rahul Dole

Keine Ahnung, warum es funktioniert hat. Ich habe den OnTouchEvent-Listener in MainActivity.Java hinzugefügt, um dieses Problem zu beheben.

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);
      }
    }
1
Chadder43

Habe dasselbe Problem mit JellyBean- und ViewPager + -Fragmenten, die WebViews enthalten. Alles in Ordnung, wenn derselbe Code auf Android 2.2 läuft. Ich denke, das ist ein Fehler in der JB WebView-Implementierung.

Bei JB funktioniert nur das erste mit WebView dargestellte Fragment ohne Fehler "Sollte nicht vorkommen .." im Protokoll, und getHitTestResult () - Aufrufe geben korrekte Werte zurück. Beim Wischen auf die nächsten Seiten habe ich Fehler im Protokoll erhalten und getHitTestResult () gibt nur Nullen und Nullen zurück.

Jetzt habe ich nur eine Lösung gefunden, um Fragmente mit leeren Containern zu erstellen und WebViews zu erstellen, sie einzurichten und Daten nur dann zu laden, wenn das aktuelle Fragment im ViewPager aktiv wird. In diesem Fall funktioniert WebView nach Bedarf. Leider wird dadurch die Vorstellung eines reibungslosen Wischens von Seiten im ViewPager völlig zerstört.

Haben Sie die letzte Idee, wird morgen versuchen, die ViewPager-Fragmente durch zusammengesetzte Ansichten zu ersetzen. Kleine Chancen, aber ich werde Sie wissen lassen, ob die Ergebnisse erfolgreich sein werden.

1
Vlad Kuts

Eine andere Lösung:

Sie müssen die WebView-Klasse nicht erweitern, um das Problem zu beheben. Das Problem wurde behoben, indem Sie die folgenden beiden Zeilen direkt nach dem Laden des Webansicht-Inhalts (myWebView.loadUrl ("...")) hinzufügen:

wv.loadUrl("your url here");

//Add the following two lines
myWebView.scrollTo(myWebView.getScrollX(), myWebView.getScrollY()+1);
myWebView.scrollTo(myWebView.getScrollX(), myWebView.getScrollY()-1);

Hoffe das hilft mir (ich habe mich selbst getestet und es hat funktioniert).

Prost

0
Ahmed

Es passierte mir auch, als ich in der Cordova + Sencha Touch-Umgebung arbeitete. Da CordovaActivity nichts wie onScrollChanged()-Methode hat, konnte ich keine der oben genannten Lösungen anwenden. 

Nachdem ich den Kopf stundenlang gegen die Wand geschlagen hatte, entdeckte ich, dass einige Teile des Web-Interfaces aufgerufen wurden, bevor dieses vollständig gerendert wurde. In meinem Fall wurden diese Methoden durch das activate-Ereignis in Ext.PanelView ausgelöst. Ich habe dieses Ereignis durch painted ersetzt und seitdem funktioniert alles wie ein Zauber.

Obwohl es sich nicht um eine Kopierlösung handelt, hoffe ich, dass es jemandem helfen kann, Zeit bei der Untersuchung zu sparen.

0
Adam Bubela