我有一个 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);
}
}