android:ZoomPicker打破了onTouchListener

tab*_*ina 10 android zoom webview ontouchlistener

我有一个使用内置缩放控件的webview,如下所示:

wv = new WebView(this);
wv.getSettings().setBuiltInZoomControls(true);
Run Code Online (Sandbox Code Playgroud)

注意:这会激活两个主要功能 - 捏合缩放和invokeZoomPicker()(后者仅在视图上执行滑动操作时调用,简单触摸不启用它)


并且我还希望在触摸事件发生时发生事情,使用以下内容

wv.setOnTouchListener(new View.OnTouchListener() {  
    public boolean onTouch(View v, MotionEvent event) {
        Log.i("touch", "touched!");
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

当WebView加载并点击屏幕时,每当我与屏幕交互时,日志都会按预期进行"触摸".但是,如果我做了一些会引发invokeZoomPicker()的事情(捏缩放似乎不会导致这个问题,只要缩放小部件没有出现),onTouchListener就会停止响应我的点击(即使几秒钟后) ,当小部件从视图中消失时).

为了确保它是invokeZoomPicker(),我编辑了我的代码的第二部分,如下所示:

wv.setOnTouchListener(new View.OnTouchListener() {  
    public boolean onTouch(View v, MotionEvent event) {
        wv.invokeZoomPicker();
        Log.i("touch", "touched!");
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

这个新的onTouch方法现在只触发一次(因此zoomwidget出现在视图上 - 并在几秒钟后消失),然后在重新加载视图之前不会再次调用onTouch方法 - 所以它肯定是invokeZoomPicker()/ Zoom小部件的问题

我是否错过了一些允许它们共存的重要代码,或者我只需要选择哪一个我可以不用的代码?

jpe*_*kin 0

这是我能找到的最接近这个问题的解决方案。每当 WebView 被触摸时,我都需要将输入焦点设置到它。我能做到的唯一方法是扩展 WebView 并覆盖 onTouchEvent 函数。即使在 Web 视图中使用缩放后也会调用此函数。

public class NewWebView extends WebView {

public NewWebView(Context context) {
    super(context);
}

public NewWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public NewWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    boolean consumed = super.onTouchEvent(ev);

    if (isClickable())
        if (ev.getAction() == MotionEvent.ACTION_DOWN)
        {
            if (!hasFocus())
                requestFocus();
        }
    return consumed;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记,如果您使用 XML 创建布局,则需要将“WebView”更改为完全限定的包名.NewWebView(否则,如果您尝试执行以下操作,则会出现令人困惑的 ClassCastException:

      webView = (NewWebView) findViewById(R.id.new_web_view);
Run Code Online (Sandbox Code Playgroud)