He creado un widget de control/que puedo reutilizar el cual he creado mediante la ampliación de RelativeLayout. Entonces, en uno de mis Actividades, he creado un grupo de estos widgets en un bucle. Sin embargo, me encontré con un problema cuando quise tener cada widget responder a un clic.

He descubierto que el establecimiento de OnTouchListener obras:

 this.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View arg0, MotionEvent arg1) {
           //Triggers debug message
        }       
    });

pero OnClickListener no:

  this.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
           //Doesn't trigger debug message  
        }

    });

¿Por qué es esto?

Se que la adición de las dos de estos para el mismo Objeto?
No, uno a la vez – comentario de los otros..
usted tiene que devolver True en el onTouchListener para evitar que el evento de conseguir que se consume.
en realidad devuelve True significa que cuenta para ser consumido. Con el fin de no consumir, usted tiene que devolver false

OriginalEl autor tpow | 2011-03-12

8 Comentarios

  1. 16

    Aquí están algunas cosas que debe comprobar para asegurarse de que sus opiniones son seleccionables:

    View.setClickable()
    View.setEnabled()
    View.setFocusable()
    View.setFocusableInTouchMode()

    Dependiendo del tipo exacto de comportamiento que se esperan obtener, necesitará configurar uno o más de los que en. Puesto que usted está recibiendo onTouch eventos, mi conjetura es que usted necesita para setClickable. Pero yo tendría que ver el punto de vista de la creación de código para estar seguro.

    Gracias por la respuesta. He probado la configuración de todos estos a la verdadera, pero no funcionó.
    La configuración de mi gran relativa diseño «de este.setClickable(true);» en realidad, fue la respuesta. Yo estaba usando un mensaje de «Tostada» como de depuración de instrucción en lugar de logcat. Resulta que yo estaba usando el contexto equivocado objeto. Gracias bro…

    OriginalEl autor Nick Campion

  2. 49

    Usted debe asegurarse de que el TouchListener no es ‘consumir’ el toque de eventos. Si devuelve verdadero de la onTouch() método, Android tendrá en cuenta lo consumido y no debe dárselo a otras diversas toque controladores (de la cual estoy suponiendo que incluirá la ClickListener).

    Que debe hacer:

    this.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View arg0, MotionEvent arg1) {
            //Triggers debug message
            return false;
        }       
    });

    OriginalEl autor nicholas.hauschild

  3. 15

    Vuelves de la booleano onTouch valor correctamente?

    De la documentación:

    onTouch() – devuelve un valor booleano para indicar
    si su oyente consume este
    evento. Lo importante es que
    este evento puede tener múltiples acciones
    que siguen el uno al otro. Por lo tanto, si usted
    devuelve false cuando la acción abajo
    se recibe un evento, que indican que
    no se ha consumido el evento y
    tampoco están interesados en posteriores
    las acciones de este evento. Por lo tanto, usted
    no va a ser llamado por cualquier otro
    las acciones dentro de un evento, como una
    dedo gesto, o el eventual hasta
    el evento de acción.

    EDITAR

    Encontrado la solución en este pregunta y sólo se trató de mí mismo.

    Que usted necesita para utilizar esta return super.onTouchEvent(event); en su onTouchEvent código. Después de agregar este el OnClickListener comenzó a trabajar.

    Muy interesante, y es bueno saberlo… sin Embargo, al probar el onClick, yo comente la OnTouch
    Editado respuesta. Probarlo y ver si funciona.
    Gracias por la actualización. Pero, no estoy seguro exactamente lo que quieres decir. Donde en el evento de toque tendría que ir? Traté de sustituir «return true» en mi OnTouchListener – El «evento» es un «MotionEvent» y la super clase no la reconoce.

    OriginalEl autor Abhinav

  4. 5

    Para realizar esta return false en su onTouch() como este:

    this.setOnTouchListener(new OnTouchListener(){    
            public boolean onTouch(View arg0, MotionEvent arg1) {   
                return false;
            }       
    });
    pero esto imposibilitaría su ontouch escucha… esto sería lo mismo que eliminar de su aplicación.

    OriginalEl autor Mohsin Shafqat

  5. 2

    Puede Implementar un onClickListener a través de 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;
            }
        });

    OriginalEl autor Hamidreza Hosseinkhani

  6. 1

    Si anula la onMotionEvent() método, por alguna razón, y necesita devolver true/false en ese caso, usted puede activar manualmente el OnClickListener() de devolución de llamada por llamada a este.performClick() dentro de la anulado onMotionEvent() justo antes de que se devuelva true/false.

    OriginalEl autor makedonian

  7. 0

    Si usted ha tratado de devolver false:

    this.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View arg0, MotionEvent arg1) {
            return false;
        }       
    });

    y no funciona, pruebe esta solución si estás utilizando ScrollView.
    Añadir un LinearLayout dentro del ScrollView.
    Conjunto puede hacer clic para una gran verdad.
    Llame setOnClickListener y setOnTouchListener desde el LinearLayout.

    <ScrollView
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:scrollbarStyle="outsideOverlay">
    
    <LinearLayout
        android:id="@+id/linearlayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusable="true"
        android:gravity="center_vertical"
        android:orientation="vertical">
    
        <content... />
    
    </LinearLayout>
    </ScrollView>
    
    
    LinearLayout linearlayout = findViewById(R.id.linearlayout);
    linearlayout.setOnClickListener...
    linearlayout.setOnTouchListener...

    OriginalEl autor live-love

Dejar respuesta

Please enter your comment!
Please enter your name here