2012-06-24 1 views
15

Tengo un RelativeLayout en el que estoy agregando muchos TextViews dinámicamente. El problema al que me enfrento es que cada vez que aplico un oyente onTouch al TextViews individualmente, detecta toques pero cuando agrego toque a mi diseño relativo, nunca responde.OnTouchListener no funciona con el diseño relativo

Este código detecta eventos de toque muy bien:

TextView tv = new TextView(this); 
tv.setText(values[i]); 
Drawable d = getResources().getDrawable(R.drawable.level_small_corners); 

tv.setClickable(true); 
tv.setId(i+1); 
tv.setTextSize(18); 
tv.setOnTouchListener(cellTouch); 

Pero cuando agrego todos estos TextViews en myRelativeLayout:

myRelativeLayout.setOnTouchListener(cellTouch); 

Ahora, el onTouchListener nunca se llama. ¿Por qué es así?

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@android:color/black" 
    > 
    . 
    . 
    . 

    <ScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/levelFirstLayout" 
      android:layout_marginBottom="70dp" 
      > 

     <RelativeLayout 

      android:id="@+id/wordsRelativeLayout" 
      android:layout_width="fill_parent" 
      android:clickable="true" 
      android:layout_height="wrap_content" 
android:clickable="true" 
android:focusable="true" 
android:focusableInTouchMode="true" 

      > 
     </RelativeLayout> 

     </ScrollView> 
    . 
    . 
    . 
     </RelativeLayout> 

Respuesta

8
tv.setClickable(true); 

la causa de su diseño, no disparar táctil evento. Intenta eliminar esto.

+1

pero entonces ¿no significaría que la vista de texto no se podrá enfocar al tocarla? –

+0

¿Por qué configurar la desactivación de clics desactiva los toques, pensé que esto lo habilitaría. – mskw

+0

Esto es más conveniente gracias también –

0

Usted tiene que fijar a la vista RelativeLayout este atributo en true: android:clickable="true"

+0

no funcionó, ya lo hizo –

+1

No funcionó porque el botón android: se puede hacer clic se refiere al uso de un clickListener, en lugar de un touchListener. – Rich

17

En myRelativeLayout.xml añadir:

android:clickable="true" 
android:focusable="true" 
android:focusableInTouchMode="true" 
+1

Ya lo he intentado. No tiene efecto.Mira las adiciones que hice –

+0

Esto funciona para mí gracias –

+0

me funciona – ashraful

13

Esto funcionó para mí:

yourRelativeLayout.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     //gesture detector to detect swipe. 
     gestureDetector.onTouchEvent(arg1); 
     return true;//always return true to consume event 
    } 
}); 
3

Puede que algo en su opinión es "por encima" de myRelativeLayout. Si es así, primero se trata del evento táctil. La peor parte de eso es que el manejo predeterminado de los eventos es no hacer nada con el evento y luego consumirlo.

Una solución sería añadir este código en cualquier componentes de la pantalla están "por encima" de la vista (o diseño) que deberían controlar el evento:

someView.setOnTouchListener (new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch (View v, MotionEvent event) 
    { 
     return false; 
    } 
}); 

La clave (obviamente) es devolver falsa . Cuando lo haces, el evento no se consumirá, sino que se pasará a "algo" en tu diseño relativo, con suerte en algún lugar donde quieras que vaya.

1

Sé que esta no es la solución para su problema, pero la suya era la más cercana a mi problema, así que tal vez esto ayude a otra persona.

Aunque parece que en el diseñador, el diseño no es "de pantalla completa" en realidad con algunas configuraciones.

Ancho envuelto, Sin acontecimientos del grifo en el acolchado/diseño

<LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 

O esto, Sin acontecimientos del grifo en el acolchado/diseño

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="0dip" 
      android:layout_height="fill_parent" 

con el padre partido, eventos de toma están despido

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
Cuestiones relacionadas