Android WebView JellyBean -> Non dovrebbe accadere: nessun nodo test-base-test trovato

La mia applicazione sta usando un sacco di webviews che si trovano in frammenti che sono detenuti da un ViewPager.

Ogni volta che passai attraverso l'applicazione sul mio Galaxy Nexus con Jellybean su di esso ho il seguente messaggio di console più e più volte:

  • Come modificare il colore del button Positivo e negativo nella window di dialogo Personalizzazione avvisi in android
  • AsyncTaskLoader onLoadFinished con un task in sospeso e il cambio di configuration
  • Reimpostare la barra di azione dopo l'utilizzo di SearchView
  • createNewFile - open failed: ENOENT (Nessun file o directory)
  • Come conoscere lo stato di digitazione in XMPP openfire utilizzando Smack
  • Come avviare l'applicazione Android solo per servizi
  • 08-23 13:44:03.374: E/webcoreglue(21690): Should not happen: no rect-based-test nodes found 

    Può chiunque a spiegarmi cosa sta andando storto qui in modo che possa essere in grado di risolvere il problema?

  • Quali sono i requisiti per utilizzare CouchDB su Android?
  • Leggere e scrivere dati tramite port USB di Android 3.1
  • Android scorre fino alla vista nascosta e scorra verso il basso l'effetto di visualizzazione dello spettacolo come twitter
  • È ansible scrivere verticalmente in una vista di text in android?
  • Questi methods di ciclo di vita di Android Fragment richiedono super
  • Android: UnknownHostException
  • 8 Solutions collect form web for “Android WebView JellyBean -> Non dovrebbe accadere: nessun nodo test-base-test trovato”

    Il problema si verifica perché in alcuni scenari WebView non riesce a notare che il suo rect visibile è cambiato, per quanto riguarda il webkit la pagina non è ancora visibile. Così tutti i tocchi cadono fuori dalla window e vengono rifiutati.

    La soluzione più pulita è quando si conosce che la visibilità del WebView è cambiata (ad esempio in risposta a una richiamata setPrimaryItem da un viewpager), call webview.onScrollChanged(webview.getScrollX(), webview.getScrollY());

    Dovresti subclassare la webview per promuovere onScrollChanged protetto su un metodo pubblico.

    Ho avuto questo problema esatto. Il problema è esattamente quello che Rahul Dole ha detto nella sua risposta sopra.

    Passano alcuni giorni su questo tentativo di molte cose diverse. Ho notato che quando l'orientamento cambiò che il WebView visibile suLongClick funzionava di nuovo … così ho scoperto questo piccolo gioiello. Infatti la sua molto hacky ma funziona!

    Utilizza questa nella tua class che estende 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); } 

    Mi sono affrontato esattamente lo stesso problema. Nella mia applicazione ovunque avessi clic su events codificati con "touchend" in jquery bind (), questo errore stava uscendo e usato per non rispondere mai ai clic (rubinetti) .. e ha dato un tipo di sensazione congelato. Quindi ho appena provato a sostituire 'touchend' con 'click' in bind (), e ha funzionato! ha risposto ai clic (rubriche) e non ha anche mostrato l'inserimento del registro di webcoglue.

    Ho trovato anche questo codice nel codice webview di 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); }​ 

    e anche questo ..

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

    Si noti che il messaggio di registro? Sto indovinando questo codice per identificare i vettori di asse x e y generati su clic o tocchi o swipes ..

    Hanno lo stesso problema con frammenti JellyBean e ViewPager + che contengono WebViews. E tutto OK con lo stesso codice in esecuzione su Android 2.2, quindi penso che questo sia un bug nell'implementazione di JB WebView.

    Su JB solo il primo frammento mostrato con WebView funziona correttamente, senza errori "Non dovrebbe succedere" nel registro e le chiamate getHitTestResult () restituiscono valori corretti. Sfiorando le pagine successive, ho ottenuto errori nel registro e getHitTestResult () restituisce solo zero e null.

    Ora ho trovato una sola soluzione per creare frammenti con contenitori vuoti e creare WebViews, impostare e caricare dati solo quando il frammento corrente diventa attivo in ViewPager. In questo caso WebView funziona come necessario. Ma, purtroppo, questo interrompe completamente un'idea di pagine lisce di scorrimento in ViewPager.

    Avere l'ultima idea, domani cercherà di sostituire i frammenti di ViewPager alle viste composte. Poche occasioni, ma ti farò sapere se i risultati avranno successo.

    Non hai idea di perché ha funzionato. Ho aggiunto l'ascoltatore diTouchEvent nella mia MainActivity.java per risolvere questo 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); } } 

    Mi è capitato anche quando lavoravo in ambiente Cordova + Sencha Touch. Poiché CordovaActivity non ha niente di simile a metodo onScrollChanged() non ho potuto applicare nessuna delle soluzioni di cui sopra.

    Dopo ore di sbattere la testa contro il muro ho scoperto che alcune parti dell'interface web erano state chiamate prima che questo fosse completamente reso. Nel mio caso questi methods sono stati innescati dall'evento di activate in Ext.PanelView . Ho sostituito l'evento con painted e da allora tutto funziona come un fascino.

    Anche se non è una soluzione di copia-pasta, spero che possa aiutare qualcuno a risparmiare tempo all'inchiesta.

    Un'altra soluzione:

    Non è necessario estendere la class WebView per risolvere questo problema. Ho risolto ciò aggiungendo le seguenti due righe subito dopo aver caricato il contenuto della visualizzazione 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); 

    Spero che questo aiuterà (ho provato me stesso e ho funzionato).

    Saluti

    Anche io ho WebView all'interno di un ViewPager e ho risolto questo problema sostituendo onTouchEvent() estendendo la class webview.

    Ecco il mio codice:

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

    Saluti !!!

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.