我有一个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);
}
}
答案 0 :(得分:0)
我自己找到了一个解决方案:用窗口进行2次间隔调用,即。 window.clearInterval(推子)确实解决了这个问题。我不太明白为什么,但看起来间隔计时器确实持续运行并且没有正确关闭。