报错内容:
Should not happen: no rect-based-test nodes found
前提:
浏览器首页采用 ViewPage + fragement+WebView形式实现,进入首页以后当前page内容可以被选中,当滑到viewpage下一页发现page内容无法被选中,打Log发现错误提示如上所示。
分析:
在当前页webview内容无法被选中,切换一次横竖屏就可以被选中了,但是滑到下一页后的你区域就无法被选中了。
viewpage在切换页面的时候,fragment中的webview没有监测到自己处于可见状态。因此,当你发现webview应该处于visible状态的时候就让它动一下,进而告知webkit来准备响应。
处理方法:
首先自定义一个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.onScrollChanged(webview.getScrollX(), webview.getScrollY());
参考:
http://stackoverflow.com/questions/12090899/android-webview-jellybean-should-not-happen-no-rect-based-test-nodes-found
//重写TabLayout里面子tab的布局方式,实现叠加效果。叠加成都mTabOverlap可以自己定义大小 protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (getChildCount() > 1) { //计算第二个view布局位置的左边坐标,如果需要叠加效果,就得减去叠加范围mTabOverlap的大小 int nextLeft = getChildAt(0).getRight() - mTabOverlap; //i=1从第二个view开始实现叠加效果,叠加到view1上面 for (int i = 1; i < getChildCount(); i++) { View tab = getChildAt(i); //每一个tab的宽度 int w = tab.getRight() - tab.getLeft(); tab.layout(nextLeft, tab.getTop(), nextLeft + w, tab.getBottom()); //计算下一个view的左侧坐标 nextLeft += w - mTabOverlap; } } }
protected int getChildDrawingOrder(int count, int i) { int next = -1; //最后绘制选中的tab,选中的tab高亮压住两边的tab if ((i == (count - 1)) && (mSelected >= 0) && (mSelected < count)) { next = mSelected; } else { //左边的tab压住右边的tab /*next = count - i - 1; if (next <= mSelected && next > 0) { next--; }*/ //右边的tab压住左边的tab if(i>=mSelected){ next = i+1; }else{ next = i; } } return next; }