9

Używam szuflady nawigacji w mojej aplikacji, która zawiera fragmenty, tak jak na poniższym obrazku.2 ViewPager nie przewija w systemie Android 2.3

enter image description here

Każdy fragment zawiera inną ViewPager że jest ImageSlider, a poniżej jest Listview i na górze Używam SwipeRefreshLayout. Mój problem polega na tym, że suwak obrazu działa dobrze na urządzeniach z Androidem 3.0 lub nowszym, ale przesunięcie w lewo lub w prawo nie działa na urządzeniach 2.3 i niższych, zamiast tego wywołuje przesunięcie nadrzędne Parent ViewPager, które porusza się po fragmencie. Używam w tym celu biblioteki wersji 4 do obsługi urządzeń niższych niż 3.0. Wszystkie funkcje działają całkiem dobrze na 2.3 urządzeniach oprócz tego. Mam googleed to, ale nigdzie nie znalazłem żadnej pomocy. Aby go przewinąć, co powinienem zrobić, każdy pomysł/pomoc będzie wysoko ceniony.

+2

umieścić swój kod !! – Techfist

+0

Znam ten błąd. Ten sam problem występuje w przypadku użycia widoku "HorizontalScrollView" lub "RecyclerView". Ogólnie rzecz biorąc funkcjonalność jest nadal dostępna, jeśli przesuniesz palcem w dół, niż możesz przewijać. – rekire

+0

Ponieważ używam polecenia swipeRefresh Layout, więc pociągnięcie w dół wywoła tę metodę. –

Odpowiedz

1

Możesz użyć tego ViewPager jako swojego rodzica ViewPager. Pozwala to przewinąć dziecko ViewPager.

public class CustomViewPager extends ViewPager { 

    public CustomViewPager(Context context) { 
     super(context); 
    } 


    public CustomViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 


    @Override 
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
     try { 
      //Handle the issue only in lower versions of android 
      if (v != this && v instanceof ViewPager && CJRAppCommonUtility.getOSVersion() < android.os.Build.VERSION_CODES.HONEYCOMB) { 
       ViewPager viewPager = (ViewPager) v; 
       int currentPage = viewPager.getCurrentItem(); 
       int size = viewPager.getAdapter().getCount(); 
       //if ViewPager has reached its end and if user tries to swipe left allow the parent to scroll 
       if (currentPage == (size - 1) && dx < 0) { 
        return false; 
       } 
       //if ViewPager has reached its start and if user tries to swipe right allow the parent to scroll 
       else if (currentPage == 0 && dx > 0) { 
        return false; 
       } 
       //Allow the child to scroll hence blocking parent scroll 
       else { 
        return true; 
       } 
      } 
      return super.canScroll(v, checkV, dx, x, y); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

Witryna dla programistów Androida zawiera ładne wyjaśnienie dotyczące obsługi zdarzeń dotyku w dokumencie Viewgroup. Możesz to polecić tutaj: http://developer.android.com/training/gestures/viewgroup.html

Mam nadzieję, że to pomoże!

0

W starszej wersji Androida requestDisallowInterceptTouchEvent nie działa tak dobrze. Rozwiązaniem jest tutaj rozszerzenie pager widoku i nadpisanie onInterceptTouchEvent i zapisanie listy przewijanych dzieci. Następnie, gdy wywoływana jest funkcja onInterceptTouchEvent, możesz przejrzeć listę przewijanych dzieci, uzyskać ich trafienie rect i sprawdzić, czy zdarzenie dotykowe znajduje się w polu trafienia rect. Jeśli tak, możesz po prostu zwrócić false, aby nie poradzić sobie z tym i pozwolić dziecku go wziąć.

coś takiego:

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    for (View view : scrollableChildren) 
    { 
     // get the hit rectangle for the view 
     Rect rect = new Rect(); 
     view.getHitRect(rect); 

     // check to see if the click was inside this child 
     if (rect.contains((int) ev.getX(), (int) ev.getY())) 
     { 
      return false; 
     } 
    } 

    return super.onInterceptTouchEvent(ev); 
} 
Powiązane problemy