2012-06-24 20 views
15

Ho un RelativeLayout in cui io sono l'aggiunta di molti TextViews dinamicamente. Il problema che sto affrontando è che ogni volta che applico un ascoltatore onTouch su TextViews individualmente, esso rileva tocchi ma quando aggiungo tocco al mio layout relativo, non risponde mai.OnTouchListener non funziona con il layout relativo

Questo codice rileva eventi touch bene:

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); 

Ma quando aggiungo tutti questi TextViews in myRelativeLayout:

myRelativeLayout.setOnTouchListener(cellTouch); 

Ora, l'onTouchListener non viene mai chiamato. Perchè è così?

<?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> 

risposta

8
tv.setClickable(true); 

sta causando il layout, di non sparare tocco evento. Prova a rimuovere questo.

+1

ma allora non significherebbe che la visualizzazione testo non sarà in grado di essere focalizzata toccandolo? –

+0

Come mai l'impostazione Clickable disabilita disabilita i tocchi, pensavo che ciò avrebbe consentito. – mskw

+0

Questo è più conveniente grazie anche a te –

0

È necessario impostare al tuo RelativeLayout vista questo attributo su true: android:clickable="true"

+0

non ha funzionato, già lo ha fatto –

+1

Non ha funzionato perché Android: switch cliccabile si riferisce all'uso di un clickListener, piuttosto che un touchListener. – Rich

17

In myRelativeLayout.xml aggiungere:

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

Ho già provato questo. Non ha effetto.Guarda le aggiunte che ho fatto –

+0

Questo funziona per me grazie –

+0

funziona per me – ashraful

13

questo ha funzionato per me:

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

Può che qualcosa nella vostra vista è "in primo piano" della myRelativeLayout. Se lo è, sta ricevendo l'evento touch per primo. La parte peggiore è che la gestione predefinita degli eventi è di non fare nulla con l'evento e quindi di consumarlo.

Una soluzione potrebbe essere quella di aggiungere questo codice su qualunque componenti del display sono "sopra" la vista (o Layout) che dovrebbe gestire l'evento:

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

La chiave (ovviamente) è quello di restituire false . Quando lo fai, l'evento non sarà consumato, ma piuttosto passato "in basso" a qualcosa nel tuo relativo layout - si spera che da qualche parte tu voglia che vada.

1

So che questa non è la soluzione per il vostro problema, ma la tua era il più vicino al mio problema, quindi forse questo aiuterà qualcun altro.

Anche se sembra che nella finestra di progettazione, il layout non è "wide screen" in realtà con alcune impostazioni.

Larghezza avvolto, Nessun evento del rubinetto in imbottitura/disposizione

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

O questo, Nessun evento del rubinetto in imbottitura/disposizione

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

Con partita genitore, Tap eventi sono sparando

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
Problemi correlati