47

私のアプリケーションは、ViewPagerによって保持されているフラグメントにある多くのWebビューを使用しています。

ジェリービーンズを搭載したGalaxyNexusのアプリをスワイプすると、次のコンソールメッセージが何度も表示されます。

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

問題を解決できるように、ここで何が問題になっているのかを誰かに説明してもらえますか?

4

8 に答える 8

22

この問題が発生するのは、一部のシナリオでは、Webkitに関する限り、WebViewが表示されている長方形が変更されたことに気付かないため、ページがまだ表示されていないためです。したがって、すべてのタッチがウィンドウの外に出て、拒否されます。

最もクリーンな修正は、WebViewの可視性が変更されたことがわかっている場合(ビューページャーからのsetPrimaryItemコールバックへの応答など)に、webview.onScrollChanged(webview.getScrollX(), webview.getScrollY());

保護されたonScrollChangedをパブリックメソッドにプロモートするには、Webビューをサブクラス化する必要があります。

于 2013-04-19T01:38:28.293 に答える
18

私はこの正確な問題を抱えていました。問題は、まさにRahulDoleが上記の回答で言ったことです。

私はこれに数日を費やして、さまざまなことを試みています。向きが変わると、表示されているWebView onLongClickが再び機能することに気づきました...そこで、この小さな宝石を思いつきました。確かにそれは非常にハッキーですが、それは機能します!

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);
}
于 2013-03-01T08:15:03.263 に答える
16

私はまったく同じ問題に直面しました。私のアプリでは、jquery bind()で「touchend」を使用してコード化されたクリックイベントがある場合は常に、このエラーが発生し、クリック(タップ)に応答しませんでした。そこで、bind()で「touchend」を「click」に置き換えてみましたが、うまくいきました。クリック(タップ)に応答し、webcoreglueのログエントリも表示しませんでした。

このコードは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=%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);
}​

そしてこれも..

// 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軸のベクトルを識別するためのものだと思います。</ p>

于 2012-09-07T11:51:24.160 に答える
1

WebViewを含むJellyBeanおよびViewPager+フラグメントでも同じ問題が発生します。そして、Android 2.2で実行されている同じコードですべてOKなので、これはJBWebView実装のバグだと思います。

JBでは、WebViewで最初に表示されたフラグメントのみが正しく機能し、ログに「発生しないはずです..」というエラーがなく、getHitTestResult()呼び出しは正しい値を返します。次のページにスワイプすると、ログにエラーが発生し、getHitTestResult()はゼロとヌルのみを返します。

空のコンテナーでフラグメントを作成してWebViewを作成し、それらをセットアップして、現在のフラグメントがViewPagerでアクティブになったときにのみデータをロードするソリューションは1つだけです。この場合、WebViewは必要に応じて機能します。しかし、残念ながら、これはViewPagerでページをスムーズにスワイプするという考えを完全に破ります。

最後のアイデアがあります。明日はViewPagerのフラグメントを複合ビューに置き換えようとします。チャンスはほとんどありませんが、結果が成功するかどうかをお知らせします。

于 2012-12-04T22:32:29.253 に答える
1

なぜそれが機能したのか見当がつかない。この問題を修正するために、onTouchEventリスナーをMainActivity.javaに追加しました。

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);
      }
    }
于 2015-03-25T00:10:24.087 に答える
0

また、Cordova +SenchaTouch環境で作業していたときにも起こりました。CordovaActivity方法のようなものがないので onScrollChanged()、私は上記の解決策のどれも適用できませんでした。

何時間も壁に頭をぶつけた後、これが完全にレンダリングされる前に、Webインターフェイスの一部が呼び出されていたことがわかりました。activate私の場合、これらのメソッドはのイベントによってトリガーされましたExt.PanelView。私はそのイベントをに置き換え、paintedそれ以来、すべてが魅力のように機能します。

コピー&ペーストの解決策ではありませんが、誰かが調査の時間を節約するのに役立つことを願っています。

于 2014-06-03T00:20:21.323 に答える
0

別の解決策:

これを修正するためにWebViewクラスを拡張する必要はありません。Webビューコンテンツをロードした直後に次の2行を追加することで修正しました(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);

これがお役に立てば幸いです(私は自分でテストしましたが、うまくいきました)。

乾杯

于 2015-06-13T15:56:52.240 に答える
-1

onTouchEvent()私もViewPager内にWebViewを持っていて、 webviewクラスを拡張してオーバーライドすることでこの問題を修正しました。

これが私のコードです:

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

乾杯 !!!

于 2014-12-02T12:07:04.187 に答える