2015-12-07 9 views
8

Mam widok przewijania z wieloma widokami relatywnego widoku w poziomie ... po jednym dla każdego rekordu w bazie danych ... tworzonych programowo.Określić, który widok w wielu widokach ma gest (podwójne kliknięcie, przeciągnięcie w lewo, przesunięcie w prawo, itp.)?

Muszę określić, na który widok mają wpływ niektóre gesty ... kliknij, kliknij dwukrotnie i przesuń w lewo/w prawo.

Oczywiście CLICK udało mi się dostać z:

 RelativeLayout rlView = new RelativeLayout(this); 
    rlView.setId(10000+myrecordid); 
    rlView.setOnClickListener(myviewclick); 

i myviewclick:

private View.OnClickListener myviewclick = new View.OnClickListener() { 
    public void onClick(View v) { 
     Integer i=v.getId()-10000; 
     // Do some processing on this view 
    } 
}; 

Z tego co znalazłem w Internecie, próbowałem dostać Gest ten sposób:

rlView.setOnTouchListener(myviewtouch); 

z tym kodem:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.i("MYLOG","double tap"); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Log.i("MYLOG","SingleTapConfirmed"); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Log.i("MYLOG","LongPress"); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right"); 
      else 
       Log.i("MYLOG","Fling Left"); 
      return true; 
     } 
    }); 
}; 

Według MYLOG otrzymuję odpowiednie gesty w razie potrzeby. Problem polega na tym, że nie wiem, jak uzyskać identyfikator widoku, w którym ten gest był. Wiem, że jest on w onTouch, ale to się nazywa gestureDetector.OnTouchEvent, aby określić ruch ... i jestem zagubiony w tym momencie.

Przeszukałem cały StackOverflow i inne witryny przez kilka godzin ... wszystkie pokazują różnice w sposobie określania gestu ... ale mają problemy ze znalezieniem czegokolwiek na temat korzystania z wielu widoków, z których mogę korzystać.

Każda pomoc zostanie doceniona.

+0

Wyjaśniam kontekst, dlaczego dodawam nagrodę [w tym pytaniu] (https://stackoverflow.com/questions/45070129/detecting-common-gestures-on-multiple-views-in-android). – Suragch

Odpowiedz

5

Myślę, że to wymyśliłem. Prawdopodobnie nie jest to najbardziej elegancki sposób na to, i mogą istnieć inne "problemy" z powodu obsługi w ten sposób, ale na razie to działa. Ale jeśli inni znajdą ten problem, oto jak go obejrzałem:

Oto jak opracował się mój zmodyfikowany kod. Dodałem zmienną publiczną o nazwie vTouch:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public View vTouch; 
    public boolean onTouch(View v, MotionEvent event) { 
     vTouch=v; 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","double tap in view: "+viewId); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","SingleTapConfirmed in view: "+viewId); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","LongPress in view: "+viewId); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      Integer viewId=vTouch.getId(); 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right in view: "+viewId); 
      else 
       Log.i("MYLOG","Fling Left in view: "+viewId); 
      return true; 
     } 
    }); 
}; 

Korzystając z wewnętrzną zmienną publiczną vTouch teraz mogę odwołać widok w każdym razie gest gdzie kiedykolwiek potrzebne jest „Widok”, że gest okazał się być w

.
+0

dzięki za to. trudno uwierzyć, że tak trudno jest wykryć przesunięcie w systemie Android! – Fattie

+0

['GestureDetector (GestureDetector.OnGestureListener listener)': Ten konstruktor został wycofany na poziomie interfejsu API 3. Zamiast niego użyj 'GestureDetector (android.content.Context, android.view.GestureDetector.OnGestureListener).] (Https: // developer. android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener)) – Suragch

+0

Testując to w wielu widokach, 'onLongPress' był uruchamiany dla każdego zdarzenia (po przerwie). To samo, co [to pytanie] (https://stackoverflow.com/q/24326530/3681880). Musiałem przesłonić 'onDraw' i zwrócić' true', aby wszystko działało. – Suragch

Powiązane problemy