WebViewを拡張したクラスでsraの回避策を試してみました。残念ながら、まだこのエラーが表示されます。
Log.i(...) を MyWebView.java にポップすることで、実際に MyWebView を使用していることを確認しました。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
Log.d("DEBUG ::: ", "in onTouchEvent() ---> ACTION_DOWN");
int temp_ScrollY = getScrollY();
scrollTo(getScrollX(), getScrollY() + 1);
scrollTo(getScrollX(), temp_ScrollY);
}
return super.onTouchEvent(event);
}
「DEBUG :::」...など...スワイプするたびに表示されるので、WebView自体ではなくMyWebViewが使用されていることがわかります。興味深いことに、右から左にスワイプすると (ページ 1 ~ N をスワイプ)、「発生しない: rect ベースのテスト ノードが見つかりません」というメッセージしか表示されません。左から右にスワイプしてもエラーは表示されません (ページ N-1 をスワイプ)。
私のフラグメント.xmlのMyWebView:
<com.example.viewpager2.MyWebView
android:id="@+id/webView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true">
</com.example.viewpager2.MyWebView>
そして MyWebView.java:
package com.example.viewpager2;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.webkit.WebView;
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MyWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
Log.d("DEBUG ::: ", "in onTouchEvent() ---> ACTION_DOWN");
int temp_ScrollY = getScrollY();
scrollTo(getScrollX(), getScrollY() + 1);
scrollTo(getScrollX(), temp_ScrollY);
}
return super.onTouchEvent(event);
}
}
sra が絶対に間違っているとは言いませんが、何か間違ったことをした場合は、それを修正できるようにしたいと思います! sra の回避策は斬新なもののように思えます。:-(
ところで、Nexus 7 エミュレーターでも、CM10.1 を使用した Nook Tab でも、このエラーが表示されます。
編集、2013-03-29 : 昨夜と今朝、さらに掘り下げました。主な理由は、主に、画面のタッチとエミュレーターをさらにいじった後、[sra の回避策] が時々機能していたが、常に正しいとは限らないことがわかったからです。左 (ページ 1 ~ N をスワイプ)。この回避策は、Nexus 7 エミュレーターよりも Nook Tab で頻繁に機能することがわかりました。
上記で最初に参照したメソッドの内部に、onTouchEvent(...)
別の Log.d(...) をいくつか追加しました。今回は、の値が何であるかを教えてくれますgetScrollX()
。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
Log.d("DEBUG ::: ", "in onTouchEvent() ---> ACTION_DOWN");
int temp_ScrollY = getScrollY();
int temp_ScrollX = getScrollX();
if(temp_ScrollX > 0) {
Log.d("RESET X COORD: WAS STARTING AT ", Integer.toString(temp_ScrollX));
setScrollX(0);
}
scrollTo(getScrollX(), getScrollY() + 1);
scrollTo(getScrollX(), temp_ScrollY);
Log.d(" DEBUG COORDS::: ", "X=" + Integer.toString(getScrollX()) + " Y=" + Integer.toString(getScrollY()) + " Y2=" + Integer.toString(temp_ScrollY));
}
return super.onTouchEvent(event);
}
私のトレース ログでは、これにより 1-N に対して次の結果が生成されました (前述のように、N-1 に対する rect ベースのテストは見たことがありません)。
03-29 06:54:32.976: E/webcoreglue(9475): Should not happen: no rect-based-test nodes found
03-29 06:54:33.335: D/DEBUG :::(9475): in onTouchEvent() ---> ACTION_DOWN
03-29 06:54:33.335: D/RESET X COORD: WAS STARTING AT(9475): 1949
03-29 06:54:33.335: D/DEBUG COORDS:::(9475): X=0 Y=10 Y2=10
03-29 06:54:33.734: D/DEBUG :::(9475): in onTouchEvent() ---> ACTION_DOWN
よく調べてみると、Right->Left (1-N) からきれいにスワイプすると、つまり境界線を正確にスワイプすると、sra の回避策が常に機能するように見えます。境界線を正確にスワイプしないと、sra の回避策が機能しません。エミュレーターを使用すると、通常の失敗はマウスのクリックが不十分であることが原因である可能性があり、確かにタッチを使用する場合よりも頻繁に発生します。
だから私が今考えているのは、ここに何か提案があるかどうか疑問に思っているのですが、タッチに加えて何らかのイベントを処理しようとする必要があるかどうかです。それが、スワイプ時にこの問題が発生する理由です?