ユーザーの操作を確認するメッセージを表示する Web ビューがあります。そのメッセージは、そのページの他の場所でユーザーが操作した後、フェードアウトする必要があります。これを行うために、onTouchEvent を検出し、Web ページへの呼び出しを挿入して、メッセージのフェードアウトをトリガーします。
これは初めてうまく機能しますが、2回目に実行すると(Webページはリロードされませんが、不透明度を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 をオーバーライドし、Web ビューに JavaScript を挿入して、次のようにメッセージ要素をフェードアウトする 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);
}
}