72 votes

Comment puis-je obtenir un événement onclick sur la visualisation Web dans Android?

Je veux juste savoir quand l'utilisateur clique sur Webview autre que sur l'hyperlien. Sur ce clic, je souhaite afficher / masquer une vue de mon activité qui contient la vue Web. Toute suggestion?

85voto

Louth Points 2943

J'ai pris un coup d'oeil à tout ça et j'ai trouvé que l' WebView ne semble pas à l'envoyer sur les événements à OnClickListener. Si quelqu'un peut me prouver le contraire ou dites-moi pourquoi, alors, je serais curieux de l'entendre.

Ce que j'ai trouvé est qu'un WebView enverra les événements tactiles à un OnTouchListener. Il possède son propre onTouchEvent méthode mais je n'ai jamais semblait MotionEvent.ACTION_MOVE à l'aide de cette méthode.

Donc, étant donné que nous pouvons obtenir événements sur une marque tactile écouteur d'événement, le seul problème qui demeure est de savoir comment contourner toute action que vous souhaitez effectuer pour une touche lorsque l'utilisateur clique sur une URL.

Ceci peut être réalisé avec un peu de fantaisie Handler jeu de jambes par l'envoi d'un message retardé pour le toucher, puis la suppression de ces messages tactiles si le contact a été causé par l'utilisateur en cliquant sur une URL.

Voici un exemple:

public class WebViewClicker extends Activity implements OnTouchListener, Handler.Callback {

private static final int CLICK_ON_WEBVIEW = 1;
private static final int CLICK_ON_URL = 2;

private final Handler handler = new Handler(this);

private WebView webView;
private WebViewClient client;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.web_view_clicker);

    webView = (WebView)findViewById(R.id.web);
    webView.setOnTouchListener(this);

    client = new WebViewClient(){ 
        @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { 
            handler.sendEmptyMessage(CLICK_ON_URL);
            return false;
        } 
    }; 

    webView.setWebViewClient(client);
    webView.setVerticalScrollBarEnabled(false);
    webView.loadUrl("http://www.example.com");
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (v.getId() == R.id.web && event.getAction() == MotionEvent.ACTION_DOWN){
        handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 500);
    }
    return false;
}

@Override
public boolean handleMessage(Message msg) {
    if (msg.what == CLICK_ON_URL){
        handler.removeMessages(CLICK_ON_WEBVIEW);
        return true;
    }
    if (msg.what == CLICK_ON_WEBVIEW){
        Toast.makeText(this, "WebView clicked", Toast.LENGTH_SHORT).show();
        return true;
    }
    return false;
}
}


Espérons que cette aide.

37voto

Vous pouvez implémenter un OnClickListener via OnTouchListener:

 webView.setOnTouchListener(new View.OnTouchListener() {

        public final static int FINGER_RELEASED = 0;
        public final static int FINGER_TOUCHED = 1;
        public final static int FINGER_DRAGGING = 2;
        public final static int FINGER_UNDEFINED = 3;

        private int fingerState = FINGER_RELEASED;


        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            switch (motionEvent.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                case MotionEvent.ACTION_UP:
                    if(fingerState != FINGER_DRAGGING) {
                        fingerState = FINGER_RELEASED;

                        // Your onClick codes

                    }
                    else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                case MotionEvent.ACTION_MOVE:
                    if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                default:
                    fingerState = FINGER_UNDEFINED;

            }

            return false;
        }
    });
 

4voto

wangzhengyi Points 41

Je pense que vous pouvez également utiliser l'état MotionEvent.ACTION_UP, par exemple:

 @Override
public boolean onTouch(View v, MotionEvent event) {
    switch (v.getId()) {
    case R.id.iv:
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (isheadAndFootShow == false) {
                headLayout.setVisibility(View.VISIBLE);
                footLayout.setVisibility(View.VISIBLE);
                isheadAndFootShow = true;
            } else {
                headLayout.setVisibility(View.INVISIBLE);
                footLayout.setVisibility(View.INVISIBLE);
                isheadAndFootShow = false;
            }
            return true;
        }
        break;
    }

    return false;
}
 

0voto

yogiam Points 134

WebViewClient.shouldOverrideUrlLoading pourrait être utile. Nous avons une exigence similaire dans l'une de nos applications. Pas encore essayé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X