9

Ich benutze Navigationsschublade in meiner App, die einige Fragmente enthält, genau wie im unteren Bild.2 ViewPager scrollt nicht in Android 2.3

enter image description here

Jedes Fragment enthält ein anderes ViewPager, dass ein Imageslider ist, und darunter ist ein Listview und an der Spitze ich die SwipeRefreshLayout verwende. Mein Problem ist, dass der Image Slider gut funktioniert auf Geräten mit Android Version 3.0 oder höher, aber der Swipe nach links oder rechts funktioniert nicht auf Geräten 2.3 und niedriger, stattdessen ruft er den Swipe des Parent ViewPager auf, der das Fragment navigiert. Ich verwende die Version 4-Bibliothek für diesen Zweck, um Geräte unter 3.0 zu unterstützen. Alle Funktionen funktionieren ziemlich gut auf 2.3 Geräten außer diesem. Ich habe es gegooglet, aber ich habe nirgends Hilfe gefunden. Um es zu scrollen, was ich tun soll, wird jede Idee/Hilfe sehr geschätzt.

+2

setzen Sie den Code !! – Techfist

+0

Ich kenne diesen Fehler. Sie haben das gleiche Problem, wenn Sie eine 'HorizontalScrollView' oder eine' RecyclerView' verwenden. Im Allgemeinen ist die Funktionalität immer noch vorhanden, wenn Sie nach unten wischen, als Sie scrollen können. – rekire

+0

Da ich das swipeRefresh-Layout verwende, ruft das Pulldown-Verfahren diese Methode auf. –

Antwort

1

Sie können dieses ViewPager als Ihr Elternteil ViewPager verwenden. Dies erlaubt dem Kind ViewPager zu blättern.

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

Android-Entwickler-Website hat eine schöne Erklärung über Touch-Ereignisse Handhabung in einem Viewgroup. Sie können es hier beziehen: http://developer.android.com/training/gestures/viewgroup.html

Hoffe es hilft !!

0

In älteren Version von Android requestDisallowInterceptTouchEvent funktioniert nicht so gut. Die Lösung besteht darin, den Pager zu erweitern und das onInterceptTouchEvent zu überschreiben und eine Liste von untergeordneten Elementen zu speichern. Wenn dann onInterceptTouchEvent aufgerufen wird, können Sie die Liste der scrollbaren Kinder durchlaufen, deren Treffer rect abrufen und sehen, ob sich das Berührungsereignis innerhalb des Treffers befindet. Wenn dies der Fall ist, können Sie einfach false zurückgeben, um nicht damit umgehen zu können und das Kind nehmen zu lassen.

Etwas wie folgt aus:

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