2012-06-24 7 views
15

Ich habe eine RelativeLayout in der ich viele TextViews dynamisch hinzufügen. Das Problem, dem ich gegenüberstehe, ist, wenn ich einen onTouch-Listener einzeln auf TextViews anwende, erkennt er Berührungen, aber wenn ich Touch zu meinem relativen Layout hinzufüge, antwortet er nie.OnTouchListener funktioniert nicht mit relativem Layout

Dieser Code erkennt Touch-Ereignisse ganz gut:

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

Aber wenn ich all diese Textviews in myRelativeLayout hinzufügen:

myRelativeLayout.setOnTouchListener(cellTouch); 

Nun wird die onTouchListener wird nie genannt. Warum ist das so?

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

Antwort

8
tv.setClickable(true); 

Ihr Layout verursacht, nicht berühren Feuer Veranstaltung. Versuchen Sie, dies zu entfernen.

+1

aber würde es dann nicht bedeuten, dass die Textansicht nicht in der Lage sein wird, durch Berühren zu konzentrieren? –

+0

Wie kommt die Einstellung Clickable deaktivieren deaktivieren berührt, dachte ich, dies würde es aktivieren. – mskw

+0

Das ist bequemer dank dir auch –

0

Sie müssen Ihre RelativeLayout Ansicht dieses Attribut auf true setzen: android:clickable="true"

+0

hat nicht funktioniert, bereits tat –

+1

Es hat nicht funktioniert, weil der android: klickbare Schalter bezieht sich auf die Verwendung eines ClickListener, anstatt ein TouchListener. – Rich

17

In myRelativeLayout.xml hinzufügen:

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

Ich habe das schon probiert. Es wirkt sich nicht aus.Schauen Sie sich die Ergänzungen an, die ich gemacht habe –

+0

Dies funktioniert für mich dank –

+0

funktioniert es für mich – ashraful

13

Das ist für mich gearbeitet:

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

es, dass etwas in Ihrer Ansicht nach kann "on top" von myRelativeLayout ist. Wenn dies der Fall ist, wird zuerst das Berührungsereignis ausgelöst. Das Schlimmste daran ist, dass die Standardbehandlung von Ereignissen darin besteht, nichts mit dem Ereignis zu tun und es dann zu verbrauchen.

Eine Lösung wäre, diesen Code hinzufügen, auf welche Komponente Ihrer Anzeige „oben“ die Ansicht (oder Layout), die das Ereignis behandeln soll:

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

Den Schlüssel (offensichtlich) falsch zurück . Wenn Sie das tun, wird das Ereignis nicht konsumiert, sondern an etwas in Ihrem relativen Layout weitergegeben - hoffentlich irgendwo, wo Sie es haben wollen.

1

Ich weiß, dass dies nicht die Lösung für Ihr Problem ist, aber Ihre war die nächste zu meinem Problem, also wird dies vielleicht jemand anderen helfen.

Auch wenn es so im Designer scheint, ist das Layout in der Realität mit einigen Einstellungen nicht "Bildschirm breit".

Breite gewickelt, Kein Antippereignis in padding/Layout

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

Oder diese, Kein Antippereignis in padding/Layout

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

mit Spiel Elternteil, Tap Ereignisse Zündung

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
Verwandte Themen