2010-06-13 7 views
0

J'ai Flipper:Android: ScrollView dans Flipper

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:id="@+id/ParentLayout" 
    xmlns:android="http://schemas.android.com/apk/res/android" style="@style/MainLayout" > 
      <LinearLayout android:id="@+id/FlipperLayout" style="@style/FlipperLayout"> 
       <ViewFlipper android:id="@+id/viewflipper" style="@style/ViewFlipper"> 
        <!--adding views to ViewFlipper--> 
        <include layout="@layout/home1" android:layout_gravity="center_horizontal" /> 
        <include layout="@layout/home2" android:layout_gravity="center_horizontal" /> 
       </ViewFlipper> 
      </LinearLayout> 
</LinearLayout> 

La première mise en page, home1, se compose d'une vue de défilement. Que dois-je faire pour distinguer entre le geste de basculement et le défilement? Actuellement:

  • si je retire la vue de défilement, je peux glisser à travers
  • si j'ajouter la vue de défilement, je ne peux défiler.

J'ai vu une suggestion que je devrais remplacer onInterceptTouchEvent (MotionEvent), mais je ne sais pas comment faire cela. Mon code, à ce moment, ressemble à ceci:

public class HomeActivity extends Activity { 
-- declares 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    -- declares & preliminary actions 

    LinearLayout layout = (LinearLayout) findViewById(R.id.ParentLayout); 
    layout.setOnTouchListener(new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     }}); 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    gestureDetector.onTouchEvent(event); 
    return true; 
    } 
class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    // http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/ 
    } 
} 

}

Quelqu'un peut-il s'il vous plaît me guider dans la bonne direction?

Merci.

Répondre

1

La vue flipper affiche uniquement une vue à la fois comme expliqué here. C'est une sorte de commutateur qui est très utile lorsque le développeur veut donner à l'utilisateur un choix quant à la façon d'afficher les données (liste, vignettes, ect). par conséquent, la raison pour laquelle vous ne pouvez pas faire défiler et lancer en même temps est parce qu'une vue défile seulement et que l'autre vue seulement lance et qu'une seule est ouverte à la fois.

Si vous voulez que votre écran défile et se lance, vous devrez concevoir une disposition qui soit capable de remplacer les méthodes nécessaires. La première étape vers ce serait de supprimer votre ViewFLipper et d'utiliser quelque chose d'autre.

Espérons que cela a été utile!

+0

Remerciez vous pour votre réponse très rapide. En fait, je pensais à un moyen de capturer l'événement de mouvement au niveau de ParentLayout (celui qui entoure le flipper) et de décider à ce niveau si le geste est un geste horizontal (à prendre en compte par le flipper) ou un vertical (à passer à la vue de défilement). C'est pourquoi l'onInterceptTouchEvent m'a semblé le bon. Il n'y a donc aucun moyen de réaliser ce que j'avais en tête? – Manu

+0

Je suppose que je ne suis pas tout à fait sûr de ce que vous essayez d'atteindre. qu'est-ce que home1 et home2, et qu'est-ce que chaque geste est supposé accomplir? que doit faire votre application? – mtmurdock

+0

Les mises en page home1 et home2 contiennent chacune un certain nombre de boutons d'image, chaque bouton d'image déclenche une activité. home1 et home2 sont inclus dans un layout appelé home, celui qui héberge le flipper. Maintenant: lorsque l'utilisateur balaie à travers je dois afficher la prochaine mise en page maison, ce qui est fait par le flipper. Mais comme ils sont nombreux boutons d'image, lorsque le téléphone est en mode paysage, ils ne correspondent pas à l'écran tous, donc je dois faire défiler, la mise en page home1. – Manu

1

Fondamentalement, si vous avez un ScrollView dans un ViewFlipper, tout ce que vous avez à faire est attacher onTouchListener au ScrollView:

ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);   
    scrollView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event){ 
      if (myGestureDetector.onTouchEvent(event)){ 
       return true; 
      } 
      else{ 
       return false; 
      } 
     } 
    }); 
0

J'essaie de cette façon de faire fonctionne:

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    scrollView.onTouchEvent(event); 
    return super.onTouchEvent(event); 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent e) 
{ 
    gestureDetector.onTouchEvent(e); 
    return super.dispatchTouchEvent(e); 
} 
Questions connexes