2011-05-30 35 views
50

he escrito estas líneas de código:Android: ¿Por qué no puedo dar onClickListener a VideoView?

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

Sin embargo, cuando ejecuto mi aplicación, el evento Click es nunca llamó.

Por eso me pregunto, ¿es imposible registrar una OnClickListener en un VideoView? Y, si es así, ¿por qué es ese el caso?

+0

mb need set clickable status: true? mVideoView.setClickable (verdadero); – Peter

Respuesta

0

El VideoView es una envoltura que contiene mdeiaplayer y SurfaceView. Puede interactuar con MediaController o escribir su propio SurfaceView e implementar eventos onClick.

71

uso VideoView.setOnTouchListener(..) funciona para VideoView

0

Usted puede tratar de Gesture Overlay View

Usted debe ser capaz de superponer este punto de vista en la parte superior de otro punto de vista con el fin de obtener los eventos táctiles.

Espero que esto ayude!

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – sashoalm

+0

d'oh. Era un novato cuando escribí este :) – Codeman

2

Esta es, probablemente, desde hace mucho tiempo, sin embargo, de alguna ayuda para aquellos que puedan funcionar en un problema similar. La forma en que resolví este problema fue colocando una vista de imagen transparente justo encima de la vista de video, luego escuchando eventos OnClick en la vista de imagen, y haciendo lo que sea que quería hacer con la vista de video después.

-3

Es posible que he hecho esto con onSetClickListener. Y aquí hay un código para su ayuda:

mVideoView.setOnClickListener(new View.OnClickListener() { 
    @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      //Here you put a condition for playing a video when you click on your video view.// 
      if(my_video.isPressed()) 
      { 
       my_video.start(); 
      } else { 
       Toast.makeText(getApplicationContext(), 
        "Not able to run This Video!", 
        Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 
+2

¡Hombre, esto es exactamente lo que el OP dice que está haciendo! El punto es que no funciona cuando se reproduce el video. – Alex

13

Así es como he resuelto la pausa/reproducción de VideoViews usando 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; 
    } 
}); 
+1

Para aquellos donde 'resume()' no funciona; aquí está la solución [Pila] (http://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCkQFjAA&url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F11960730 % 2Fresume-playing-videoview-from-onresume & ei = JmbjUqmGK8P9rAe29IDYBA & usg = AFQjCNHWIPXnoKBCfV4ctFukFPDXYl303g & sig2 = NJyXl7J9j8FA3AOBEmIXow & bvm = bv.59930103, d.bmk) – BlueSword

+0

¿Cuál es el propósito de la variable 'bVideoIsBeingTouched'? Por lo que puedo ver, solo estás reescribiéndolo pero no lo usas. – Jerry

13

Sé que esto es viejo pero he usado esto:

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

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

      return false; 
     } 
    }); 
+0

Traté de usar este fragmento, pero cuando hago clic en él, la actividad se cierra y la aplicación se apaga. – vhbsouza

+0

Sí, hice lo mismo, y está funcionando para mí ahora. –

12

Sé que esta es una pregunta antigua, pero esto es lo que hice:

Como no se activó setOnClickListener, creé mi propia clase que se extiende VideoView

public class VideoViewCustom extends VideoView{ 

y overrided la onTouchEvent

@Override 
public boolean onTouchEvent(MotionEvent ev) { 

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

    return super.onTouchEvent(ev); 
} 

y ahora puedo conseguir el evento de clic con el MotionEvent.

Espero que esto ayude a alguien!

+8

En general, los eventos táctiles para "hacer clic" solo deberían consumirse en ACTION_UP, no en ACTION_DOWN para permitir que el usuario exprese la intención de hacer clic. Es por eso que existen otros eventos como ACTION_CANCEL. El usuario comienza a presionar, luego mueve su puntero fuera de los límites de la vista. – Dallas

+0

Dallas tiene razón, debería ser ACTION_UP en lugar de ACTION_DOWN –

+4

Acabo de encontrarme con este problema y acepto que ACTION_UP suele ser una mejor práctica, pero en este caso, ¡el VideoView solo parece proporcionar ACTION_DOWN! –

1

Puede también utilizar un botón que es transparente a la vista de vídeo si quieres una parte específica del vídeo en contacto para hacer algo.

2

Comprendo que esto es una vieja pregunta, pero pensé que interrumpiría con una solución fácil. No puedo responder por qué esto no funciona, parece una gran desviación en mi opinión. Pero una solución fácil es colocar su VideoView como la única Vista dentro de FrameLayout, y establecer un OnClickListener en el diseño. no es ideal, pero funciona.

Cuestiones relacionadas