0

ユーザーの操作を確認するメッセージを表示する 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);
   }
 }
4

1 に答える 1

0

私は自分自身に魂を見つけました:ウィンドウで2つのインターバル呼び出しの前に、すなわち。window.clearInterval(fader)は問題を修正しました。理由はよくわかりませんが、インターバルタイマーが永続的に実行され続け、適切にオフにされなかったようです。

于 2012-08-01T02:44:05.597 に答える