在不禁用 Web 视图的超链接和按钮的情况下删除默认选择
remove default selection without disabling web view's hyperlinks and buttons
我正在使用 btwebview 获取文本选择并进行处理。问题是当我将 longPress 与 gestureDetector 一起使用时,默认选择也会启动,如果我重写 onTouchEvent 和 return true,问题就解决了,但我无法点击任何按钮或在 webview 上突出显示 link ,所以我无法访问 webview 中插入的脚注或视频,并且 shouldOverrideUrlLoading 停止调用。
public void init(Context context) {
System.out.println("BTWebview init");
this.context = context;
this.getSettings().setJavaScriptEnabled(true);
gestureScanner = new GestureDetector(this);
this.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
System.out.println("event "+event.toString() );
return gestureScanner.onTouchEvent(event);
}
});
setInitialScale(100);
addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.print("on touch event "+ event.toString());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
System.out.println("gesture listener onLongPress");
mSelection = true;
if(!this.isInSelectionMode()){
System.out.println("onLongClick in selection mode");
mSelection = true;
}
this.loadUrl("javascript:android.selection.longTouch();");
mScrolling = true;
System.out.println("onLongClick");
}
webview 停止响应触摸的原因是因为该功能是在超类中实现的onTouchEvent
。
因此,要使其再次运行,您需要在 onTouchEvent
中的某处调用 super.onTouchEvent(event)
。显然,总是调用它会让你回到开始的地方。
要实现您想要执行的操作,您需要仅在尚未检测到该事件是长按事件时才调用 super.onTouchEvent
。执行此操作的最简单方法是存储传入 onLongPress
的 MotionEvent
的指针 ID(您应该能够假设它将是索引 0 处的指针,因为长按是通过定义单次触摸事件)。
一旦你有了这个,你的 onTouchEvent 可能看起来像这样
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getPointerId(0) != self.lastLongPressPointerId) {
return super.onTouchEvent(event);
}
return true;
}
您可能还需要监视与指针相关的 ACTION_UP 和 ACTION_CANCEL 事件,并在此之后停止寻找它,以防系统决定重用指针 ID。
我正在使用 btwebview 获取文本选择并进行处理。问题是当我将 longPress 与 gestureDetector 一起使用时,默认选择也会启动,如果我重写 onTouchEvent 和 return true,问题就解决了,但我无法点击任何按钮或在 webview 上突出显示 link ,所以我无法访问 webview 中插入的脚注或视频,并且 shouldOverrideUrlLoading 停止调用。
public void init(Context context) {
System.out.println("BTWebview init");
this.context = context;
this.getSettings().setJavaScriptEnabled(true);
gestureScanner = new GestureDetector(this);
this.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
System.out.println("event "+event.toString() );
return gestureScanner.onTouchEvent(event);
}
});
setInitialScale(100);
addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.print("on touch event "+ event.toString());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
System.out.println("gesture listener onLongPress");
mSelection = true;
if(!this.isInSelectionMode()){
System.out.println("onLongClick in selection mode");
mSelection = true;
}
this.loadUrl("javascript:android.selection.longTouch();");
mScrolling = true;
System.out.println("onLongClick");
}
webview 停止响应触摸的原因是因为该功能是在超类中实现的onTouchEvent
。
因此,要使其再次运行,您需要在 onTouchEvent
中的某处调用 super.onTouchEvent(event)
。显然,总是调用它会让你回到开始的地方。
要实现您想要执行的操作,您需要仅在尚未检测到该事件是长按事件时才调用 super.onTouchEvent
。执行此操作的最简单方法是存储传入 onLongPress
的 MotionEvent
的指针 ID(您应该能够假设它将是索引 0 处的指针,因为长按是通过定义单次触摸事件)。
一旦你有了这个,你的 onTouchEvent 可能看起来像这样
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getPointerId(0) != self.lastLongPressPointerId) {
return super.onTouchEvent(event);
}
return true;
}
您可能还需要监视与指针相关的 ACTION_UP 和 ACTION_CANCEL 事件,并在此之后停止寻找它,以防系统决定重用指针 ID。