2010-12-09 12 views
8

ich meine TabActivity mit verschiedenen Kind-Aktivitäten umgesetzt haben: WerkeAndroid: GestureDetector nicht funktioniert (gestureDetector.onTouchEvent (event) immer false) mit Tabs (TabActivity, TabWidget)

intent = new Intent().setClass(this, MyChildTabActiviy.class); 
// Initialize a TabSpec for each tab and add it to the TabHost 
spec = getTabHost.newTabSpec("tag").setIndicator("indicator", getResources().getDrawable(R.drawable.icon)).setContent(intent); 
getTabHost.addTab(spec); 
... 

Bisher keine Probleme, alles perfekt fein. Ich wechsle programmgesteuert zwischen Tabs und ersetze Aktivitäten in Tabs mit ActivityGroups, etc., so wie es in vielen Tutorials gezeigt wird.

Aber mein Problem ist, dass, wenn ich nach einer Fling-Geste suchen möchte, mein GestenDetector.onTouchEvent (event) immer falsch zurückkehrt, also keine Geste registriert wird.

Diese meine Implementierung von gestureDetector ist:

public class MyChildTabActiviy extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // ... building views, controls, etc. 
     GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 
class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
    return false; 
    // left to right swipe and right to left swipe 
    if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
    //... fling logic ... 
    return true; 
    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
    //... fling logic ... 
    return true; 
    } 
    return false; 
    } 
} 

Die Sache ist, dass dieser Code (und auch die fling Erkennung) arbeitet völlig in Ordnung, wenn ich diese Aktivitäten fange (es vier grundlegende Aktivitäten sind, (manchmal wechsele ich zu anderen Aktivitäten) außerhalb einer TabActivity, z als Startaktivität. Aber ich kann es nicht innerhalb einer TabActivity zum Laufen bringen. Ich habe bereits versucht, den GestureDetector an die TabActivity anzuhängen, aber es funktioniert nicht. Ich habe versucht, den GestureDetector an bestimmte Ansichten wie Layoutansichten oder Schaltflächen, ViewFlippers usw. anzuhängen, aber es funktioniert einfach nicht. Wenn ich debugge, kann ich sehen, dass das Berührungsereignis ausgelöst wird und eine Bewegung registriert wird, aber es wird nur nicht als ein Fling oder eine andere Geste ausgewertet.

Also meine Frage ist, gibt es irgendwelche Einschränkungen hinsichtlich der Verwendung von GestureDetectors mit Tabs in Android? Wie gesagt, die Gesten sind perfekt außerhalb einer TabActivity registriert.

Ich würde sehr die Hilfe von jemandem schätzen, der die Antwort kennt. Wenn es eine Beschränkung gibt, wie könnte jemand eine Abhilfe für dieses Problem bekommen?

Vielen Dank im Voraus für die Antworten.

+0

Mögliches Duplikat von [Fling Gestenerkennung auf Gitterlayout] (http://stackoverflow.com/questions/937313/fling-gesture-detection-on-grid-layout) – BergQuester

Antwort

19

Werfen Sie einen Blick auf die Antwort here. Er ist ziemlich genau dasselbe wie du, aber wenn du dir den ersten Kommentar zu der am höchsten bewerteten Antwort ansiehst, hat Cdsboy es durch die Implementierung von OnDown und die Rückgabe von True geschafft. Ich bin mir nicht sicher, warum das nötig ist, aber es hat für mich funktioniert.

+1

Das hat mir auch geholfen! Ich hatte etwas onFling-Code, der in 1.5 und 1.6 gut funktionierte, aber ab 2.1 funktionierte es nicht mehr ... die Rückgabe von true in onDown() behob das Problem. – Justin

+0

danke ... es funktionierte gut ... brauchte auch die OnDown() Methode ... – ahsan

+0

@Object Wenn ich 'onDown() 'überschreibe, wurde meine' onFling() 'nicht aufgerufen. – BBdev

7

Als Ergänzung zu @Abhinav ‚s Antwort (das ich auch btw half), würde ich sagen, dass ich glaube, zwingende onDown() denn nötig ist seine Standardimplementierung in SimpleOnGestureListener ist false zurückzukehren. Als ACTION_DOWN der erste, der den Zuhörer erreicht, würde es das Ereignis verwerfen, egal was es ist.

+0

ahh deshalb. Danke, dass du dir die Zeit genommen hast, es zu erklären. –

Verwandte Themen