2013-06-11 4 views
11

Donc, j'ai mon activité qui a un ViewPager principal et à l'intérieur de la ViewPager chaque page a tout le contenu comme un ScrollView et à l'intérieur de ce ScrollView il y a un autre ViewPager. Cela peut sembler fou, mais fondamentalement le ViewPager externe contient des articles de presse, et les articles sont longs, de sorte qu'il y a un ScrollView, et à l'intérieur du ScrollView, il y a plusieurs vignettes/images qu'ils peuvent également balayer.Android ViewPager avec ScrollViews avec ViewPagers dans les ScrollViews

J'ai essayé quelques ViewPagers personnalisés différents avec différentes interceptions d'événements tactiles mais je n'arrive pas à l'obtenir parfaitement. Il absorbera complètement tous les événements tactiles, de sorte que le défilement vertical du ScrollView ne fonctionnera pas dans cette zone, ou il sera vraiment difficile/difficile d'en faire défiler horizontalement l'intérieur.

Quelqu'un at-il une solution parfaite?

+0

Avez-vous résolu votre problème? J'essaie de faire exactement ce que tu as essayé. – tasomaniac

+0

Oui ma solution est ci-dessous. Dis-moi si tu as besoin d'aide! – egfconnor

+0

J'ai essayé cette solution, mais elle me donne des problèmes avec les éléments cliquables dans la disposition de défilement. Lorsque je défile verticalement sur un élément cliquable, la vue défilement ne défile pas. – tasomaniac

Répondre

12

Au cas où quelqu'un veut savoir ma solution:

public class CustomScrollView extends ScrollView { 
private GestureDetector mGestureDetector; 
View.OnTouchListener mGestureListener; 

public CustomScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mGestureDetector = new GestureDetector(context, new YScrollDetector()); 
    setFadingEdgeLength(0); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return super.onInterceptTouchEvent(ev) 
      && mGestureDetector.onTouchEvent(ev); 
} 

// Return false if we're scrolling in the x direction 
class YScrollDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
     if (Math.abs(distanceY) > Math.abs(distanceX)) { 
      return true; 
     } 
     return false; 
    } 
} 
} 

et le plus ViewPager est externe:

public class NestingViewPager extends ViewPager { 

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

public NestingViewPager(final Context context) { 
    super(context); 
} 

@Override 
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
    if (v != this && v instanceof ViewPager) { 
     return true; 
    } 
    return super.canScroll(v, checkV, dx, x, y); 
} 
} 
+2

Ce code m'a sauvé la vie! Merci :) –

+0

Heureux qu'il vous a aidé! – egfconnor

+0

Hey, j'ai un problème avec une vue de défilement et de voir le pager à l'intérieur de celui-ci, mais le défilement verticall ne fonctionne pas même avec ur custon scrollview ?? – Tony

Questions connexes