0

我有一个 webview 显示一条消息以确认用户交互。该消息应该在该页面上其他位置的任何用户交互后淡出。为此,我检测到任何 onTouchEvent 并返回对网页的调用以触发消息淡出。

这第一次效果很好,但如果我第二次这样做(网页没有重新加载,但通过将不透明度设置回 1 并显示为“阻止”,通过 javascript 再次显示消息)消息再次出现但随后淡出立即没有任何用户交互。从日志语句中我可以看到 onTouchEvent 没有被触发并且我没有注入 javascript。

我怀疑 loadURL 在网页中创建了一些弹性调用,这些调用会一直存在并以某种方式再次激活。有什么办法可以清除它并只看到它执行一次?

我像这样在我的 WebView 中捕获 onTouchEvent:

    final class MyWebView extends WebView {
    ...
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"onTouchEvent");
        if (mUndoActive && (event.getAction() == MotionEvent.ACTION_DOWN)) {
            mUndoActive = false;
            mLastAction = LAST_ACTION_NONE;
            Log.v(TAG,"send hide message");
            handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 300);
        }
        return super.onTouchEvent(event);
    }
}

在父活动中,我覆盖了 handleMessage 并将 javascript 注入到我的 webview 以触发淡出消息元素的 javascript,如下所示:

    @Override
    public boolean handleMessage(Message msg) {
      Log.v(TAG,"handleMessage triggered");
      if (msg.what == CLICK_ON_WEBVIEW){
        Log.v(TAG,"handle message registerd click from stack view web page");
        webview.loadUrl("javascript:hideMessage()");
        return true;
      }
      return false;
    }

和 webview 中的 javascript 是:

function hideMessage() {
  var message = document.getElementById("message");
  if (message != null) {
    if (!message.style.opacity) {
     message.style.opacity = 1;
    } 
    var fader = setInterval(function(){
      message.style.opacity -= .02;
      if (message.style.opacity <= 0) {
        clearInterval(fader);
        message.style.display = "none";
      }
    }, 25);
   }
 }
4

1 回答 1

0

我自己找到了一个解决方案:在 2 个间隔调用之前使用窗口,即。window.clearInterval(fader) 确实解决了这个问题。我不太明白为什么,但看起来间隔计时器确实一直在运行并且没有正确关闭。

于 2012-08-01T02:44:05.597 回答