Android WebView JellyBean->;不应发生:未找到基于rect的测试节点

Android WebView JellyBean->;不应发生:未找到基于rect的测试节点,android,webview,android-webview,android-4.2-jelly-bean,Android,Webview,Android Webview,Android 4.2 Jelly Bean,我的应用程序使用了很多Web视图,这些视图位于由ViewPager保存的片段中 每当我在装有Jellybean的Galaxy Nexus上浏览应用程序时,我会一次又一次地收到以下控制台消息: 08-23 13:44:03.374: E/webcoreglue(21690): Should not happen: no rect-based-test nodes found 有谁能向我解释一下这里出了什么问题,这样我就可以解决这个问题了 我面临着完全相同的问题。在我的应用程序中,无论我在哪里使用

我的应用程序使用了很多Web视图,这些视图位于由ViewPager保存的片段中

每当我在装有Jellybean的Galaxy Nexus上浏览应用程序时,我会一次又一次地收到以下控制台消息:

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

有谁能向我解释一下这里出了什么问题,这样我就可以解决这个问题了

我面临着完全相同的问题。在我的应用程序中,无论我在哪里使用jquery bind()中的“touchend”编码单击事件,都会出现此错误,并且它过去从不响应单击(点击)。。给人一种冰冻的感觉。 所以我试着在bind()中将“touchend”替换为“click”,结果成功了!回应了点击(点击),也没有显示webcoreglue的日志条目

我还在Android的webview代码中找到了这段代码

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);
}​
HTMLElement*WebViewCore::retrieveElement(int x,int y,
常量限定名(标记名和标记名)
{
HitTestResult HitTestResult=m_mainFrame->eventHandler()
->HitTestResultaPoint(输入点(x,y)),false,false,
DontHitTestScrollbars,HitTestRequest::Active | HitTestRequest::ReadOnly,
IntSize(1,1));
如果(!hitTestResult.innerNode()| |!hitTestResult.innerNode()->inDocument()){
LOGE(“不应发生:未在文档节点中找到”);
返回0;
}
const ListHashSet&list=hitTestResult.rectBasedTestResult();
if(list.isEmpty()){
LOGE(“不应发生:未找到基于rect的测试节点”);
返回0;
}
Node*Node=hitTestResult.innerNode();
节点*元素=节点;
而(元素&(!元素->isElementNode()
||!元素->标记名(标记名))){
元素=元素->父节点();
}
DBG_NAV_LOGD(“节点=%p元素=%p x=%d y=%d节点名称=%s标记名=%s”,节点,
元素,x,y,节点->节点名().utf8().data(),
元素?((元素*)元素)->标记名().utf8().data():“”);
返回静态类型(元素);
}​
还有这个

// 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...
//获取带有坡度的接触点(x,y)的高亮矩形
向量WebViewCore::getTouchHighlightRects(int x,int y,int slop)
{
向量矩形;
m_mousePos=IntPoint(x-m_scrollpoffsetx,y-m_scrollpoffsety);
HitTestResult HitTestResult=m_mainFrame->eventHandler()->HitTestResultaPoint(IntPoint(x,y),
false,false,DontHitTestScrollbars,HitTestRequest::Active | HitTestRequest::ReadOnly,IntSize(slop,slop));
如果(!hitTestResult.innerNode()| |!hitTestResult.innerNode()->inDocument()){
LOGE(“不应发生:未在文档节点中找到”);
返回矩形;
}
const ListHashSet&list=hitTestResult.rectBasedTestResult();
if(list.isEmpty()){
LOGE(“不应发生:未找到基于rect的测试节点”);
返回矩形;
}
//这里省略了该部分的其余部分。。。
注意这里的日志消息?我猜这段代码是用来识别点击、轻触或滑动时生成的x轴和y轴向量的。。

包含WebView的JellyBean和ViewPager+片段也有同样的问题。在Android 2.2上运行相同的代码也可以,所以我认为这是JB WebView实现中的一个bug

在JB上,只有WebView中显示的第一个片段正常工作,日志中没有错误“不应该发生…”,getHitTestResult()调用返回正确的值。切换到下一页时,我在日志中看到错误,getHitTestResult()只返回零和null

现在,我发现只有一种解决方案可以使用空容器创建片段并创建WebView,只有当当前片段在ViewPager中处于活动状态时才进行设置并加载数据。在这种情况下,WebView可以根据需要工作。但不幸的是,这完全打破了在ViewPager中平滑滑动页面的想法


最后一个想法是,明天将尝试将ViewPager的片段替换为复合视图。可能性很小,但我会让您知道结果是否会成功。

我遇到了这个问题。问题正是Rahul Dole在上面的回答中所说的

我花了几天的时间尝试了很多不同的东西。我注意到,当方向改变时,只需长按一下就可以看到的网络视图再次工作了…所以我想出了这个小宝石。它确实非常粗糙,但它可以工作

在扩展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);
}

出现此问题的原因是,在某些情况下,WebView未能注意到其可见矩形已更改,因此就webkit而言,该页面仍然不可见。因此,所有触摸都会落在窗口之外,并被拒绝

最干净的修复方法是当您知道WebView的可见性已更改(例如响应来自viewpager的setPrimaryItem回调时),调用
WebView.onScrollChanged(WebView.getScrollX(),WebView.getScrollY());


您需要对webview进行子类化,以将受保护的OnScroll升级为公共方法。

我在Cordova+Sencha Touch环境中工作时也遇到过这种情况。因为
CordovaActivity
没有类似于
onScrollChanged()
的方法我无法应用上述任何解决方案

在我的头撞了几个小时后,我发现web界面的某些部分在完全呈现之前就被调用了。在我的例子中,这些方法是由
Ext.PanelView
中的
activate
事件触发的。我将该事件替换为
painted
,从那时起,一切都像魔咒一样工作


虽然它不是复制粘贴解决方案,但我希望它可以帮助某人节省调查时间。

甚至我在ViewPager中有WebView,并通过扩展WebView类覆盖onTouchEvent()修复了此问题

这是我的密码:

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

干杯!!!

我不知道它为什么会起作用。我在MainActivity.java中添加了onTouchEvent listener来解决这个问题

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);
      }
    }
另一个
wv.loadUrl("your url here");

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