2010-11-22 9 views
6

Ich habe eine Aktivität, die einen Gesture Detector implementiert, um die Benutzereingabe für die Navigation zu anderen Bildschirmen zu erfassen. Das hat gut geklappt - aber - ich habe kürzlich eine Klasse aktualisiert, die von BaseActivity abgeleitet ist, um eine onClick-Funktion hinzuzufügen, und nun scheint dieses Klickereignis zu verhindern, dass der onFling getroffen wird. Das onClick ist an einen TextView-Bereich (in einem LinearLayout) gebunden, den ich auf meinem Bildschirm habe. Die Methode resultsClick ist über die Eigenschaft onClick des XML-Layouts mit TextView verbunden.Android onClick blockiert onFling

Ich habe versucht, die Rückgabewerte in onSingleTapUp und onDown ohne Glück zu ändern. Ich habe auch versucht, log-Anweisungen zu allen folgenden Funktionen hinzuzufügen. Keines von ihnen feuert, wenn ich in den TextView-Bereich schiebe, aber sie tun es in anderen Bereichen des Bildschirms.

Vielleicht verwende ich die falschen Suchbegriffe, aber ich konnte kein Beispiel finden, das dies ansprach - aber ich bin mir sicher, dass dieses Problem bereits gelöst wurde.

public class DerivedActivity extends BaseActivity 
{ 
    ... 
    /** 
    * resultsClick - The user clicked on the Results area 
    * @param v 
    */ 
    public void resultsClick(View v) 
    { 
     try 
     { 
     Log.i(this.toString(), "resultsClick"); 
     startActivity(new Intent(this, Results_TabHost.class)); 
     } 
     catch (Exception e) 
     { 
     Log.e(this.toString(), "Exception" + e.toString()); 
     } 

    }// end resultsClick 
    ... 
} 

ist die Basisklasse, die die GestureListener Code

public class BaseActivity extends ActivityGroup 
          implements OnGestureListener 
{ 
    ... 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    public boolean onFling(MotionEvent e1, 
          MotionEvent e2, 
          float velocityX, 
          float velocityY) 
    { 
     try 
     { 
     Log.i(this.toString(), "onFling"); 

     // jump right out if not a swipe/fling 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
     { 
      return false; 
     } 

     // right to left swipe 
     if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && 
      Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      Log.i(this.toString(), "fling left"); 
      rightArrowClick(null); 

     } 
     else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && 
        Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      Log.i(this.toString(), "fling right"); 
      leftArrowClick(null); 
     } 
     } 
     catch (Exception e) 
     { 
     Log.e(this.toString(), "Exception" + e.toString()); 
     } 

     return true; 

    }// end onFling 

    // These next methods we are required to have - even if unused - 
    // in order for the Gesture Handling to work 

    @Override 
    public boolean onTouchEvent(MotionEvent motionEvent) 
    { 
     return this.gestureDetector.onTouchEvent(motionEvent); 
    } 

    @Override 
    public void onLongPress(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 
... 
} 

Antwort

3

Ihre Implementierung von onTouchEvent implementiert ist falsch. Sie geben einfach den Wert des GestenDectors-Ergebnisses zurück.

Wenn Ihr Gestendetektor jedoch keine Gesten erkennt, sagen Sie dem Anrufer "Ich hatte hier nichts zu tun", und das Berührungsereignis wird niemals an die untergeordneten Elemente der Aktivität gesendet.

Sie müssen super.onTouchEvent() anrufen, wenn Ihr Gestendetektor das Ereignis nicht behandelt hat.

+0

@CodeFusionMbile - vielen Dank für Ihren Vorschlag. Ich habe gerade versucht, das onTouchEvent mit dem obigen Code zu aktualisieren, aber das Verhalten war nicht von Bedeutung. Ich habe jedem der Gestenereignisse ein Protokoll hinzugefügt, um sicherzugehen. Wenn ich versuche, über den Bildschirm zu wischen, sehe ich das Protokoll der Ergebnisse, aber ich sehe keinen der anderen, der eingeloggt ist. – bursk

1

Sie können einfach false zurückgeben, wenn nichts von Ihrem Code getan wird ... Es wird das Motion-Event-System alles selbst verwalten lassen. true zurück, wenn Sie das Ereignis beenden wollen sehen zu anderen Childs abgefertigt werden ..

3

Bitte geben Aufmerksamkeit auf diese Funktion:

@Override 
    public boolean onDown(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 

den Rückgabewert auf false Bitte ändern.