web-dev-qa-db-fra.com

Android: Pourquoi ne puis-je pas attribuer un onClickListener à un VideoView?

J'ai écrit ces lignes de code:

 mVideoView = (VideoView) findViewById(R.id.video_view);
    mVideoView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.v("LOG_TAG, click");
        }
    });

Cependant, lorsque j'exécute mon application, l'événement click n'est jamais appelé.

Je me demande donc s'il est impossible d'enregistrer un OnClickListener sur un VideoView? Et si oui, pourquoi est-ce le cas?

54
Fabian

utiliser VideoView.setOnTouchListener(..) cela fonctionne pour VideoView

75
newdev

Je sais que c’est une question ancienne, mais voici ce que j’ai fait:

Comme setOnClickListener n'est pas déclenché, j'ai créé ma propre classe, qui étend VideoView

public class VideoViewCustom extends VideoView{

et annulé l'événement onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent ev) {

    if(ev.getAction() == MotionEvent.ACTION_DOWN){
        Log.d(TAG, "ACTION_DOWN");
    }

    return super.onTouchEvent(ev);
}

et maintenant je peux obtenir l'événement onClick avec MotionEvent.

J'espère que cela aide quelqu'un!

14
Larry Mustaine

Voici comment j'ai résolu la pause/lecture de VideoViews avec onTouch:

// Class variables
private boolean bVideoIsBeingTouched = false;
private Handler mHandler = new Handler();

vvVideo.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    if (!bVideoIsBeingTouched) {
        bVideoIsBeingTouched = true;
    if (vvVideo.isPlaying()) {
        vvVideo.pause();
    } else {
        vvVideo.resume();
    }
    mHandler.postDelayed(new Runnable() {
        public void run() {
            bVideoIsBeingTouched = false;
        }
        }, 100);
    }
    return true;
    }
});
14
Dan

Je sais que c'est vieux mais j'ai utilisé ceci:

    mVideoView.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            Log.i(TAG, "Video 1 clicked, starting playback");

            return false;
        }
    });
13
nawlrus

Cela aurait probablement dû être fait depuis longtemps, ce qui pourrait néanmoins aider les personnes susceptibles de rencontrer un problème similaire. Pour résoudre ce problème, j’ai posé une vue d’image transparente juste au-dessus de la vue vidéo, puis écouté les événements onClick sur la vue d’image et fait ce que je voulais faire par la suite.

2
Michael M

Je me rends compte que c’est une vieille question, mais j’ai pensé que j’écrirais avec une solution de contournement facile. Je ne peux pas répondre pourquoi cela ne fonctionne pas - me semble être un oubli important. Mais une solution de contournement simple consiste à placer votre VideoView comme seule vue dans un FrameLayout et à définir un OnClickListener sur la présentation. Pas idéal, mais ça marche.

2
mszaro

Vous pouvez également utiliser un bouton transparent sur la vue vidéo si vous souhaitez qu'une partie spécifique de la vidéo tactile fasse quelque chose. 

1
Mouna

VideoView est un wrapper contenant mdeiaplayer et surfaceView. Vous pouvez interagir avec MediaController ou écrire votre propre SurfaceView et implémenter des événements onClick.

0
nahwarang

Vous pourriez essayer Vue superposition de geste

Vous devriez pouvoir superposer cette vue sur une autre vue pour obtenir des événements tactiles.

J'espère que cela t'aides!

0
Codeman