J'ai une «page» qui contient un certain nombre de composants et dont le contenu est plus long que la hauteur de l'appareil. Très bien, il suffit de mettre toute la mise en page (toute la page) dans un ScrollView
, pas de problème.
L'un des composants est un ViewPager
. Le rendu est correct, mais la réponse à un balayage / lancer ne fonctionne pas correctement, elle est instable et ne fonctionne pas toujours. Cela semble être `` confondu '' avec le ScrollView
, donc ne fonctionne à 100% que lorsque vous lancez une ligne horizontale exacte.
Si je supprime le ScrollView
, le ViewPager répond parfaitement.
J'ai fait une recherche et je n'ai pas trouvé cela comme un défaut connu. Quelqu'un d'autre a-t-il vécu cela?
- Version de la plate-forme: 1.6
- Bibliothèque de compatibilité v4.
- Appareil: HTC Incredible S
Vous trouverez ci-dessous un exemple de code avec lequel tester, commenter ScrollView
pour le voir fonctionner correctement.
Activité:
package com.ss.activities;
import com.ss.R;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.TextView;
public class PagerInsideScollViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
vp.setAdapter(new MyPagerAdapter(this));
}
}
class MyPagerAdapter extends PagerAdapter {
private Context ctx;
public MyPagerAdapter(Context context) {
ctx = context;
}
@Override
public int getCount() {
return 2;
}
@Override
public Object instantiateItem(View collection, int position) {
TextView tv = new TextView(ctx);
tv.setTextSize(50);
tv.setTextColor(Color.WHITE);
tv.setText("SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, " +
"SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, " +
"SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, SMILE DUDE, " +
"SMILE DUDE, SMILE DUDE, SMILE DUDE");
((ViewPager) collection).addView(tv);
return tv;
}
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
Disposition:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="300dp" />
</LinearLayout>
</ScrollView>
la source
Réponses:
J'ai eu le même problème. Ma solution a été d'appeler
requestDisallowInterceptTouchEvent
lorsque le défilement ViewPager a commencé.Voici mon code:
la source
Une lecture plus approfondie a révélé qu'il existe des problèmes avec les composants de défilement à l'intérieur des composants de défilement.
Une solution est de «désactiver» le défilement vertical du ScrollView sur la zone du composant scrollable contenu, dans mon cas un ViewPager.
Le code de cette solution est détaillé ici (et c'est tout simplement génial!)
la source
Voici une solution:
Fondamentalement, définir les valeurs X, Y lorsque vous appuyez vers le bas et calculer la distance tout en faisant glisser pour déterminer dans quelle direction nous voulons aller. Jouez avec le seuil de glissement pour optimiser votre cas.
la source
Avec un ViewPager, vous pouvez capturer les événements de changement de page et empêcher le ScrollView d'intercepter l'événement tactile qui a provoqué le changement de page.
C'est très simple, en utilisant
ViewGroup.requestDisallowInterceptTouchEvent(boolean)
. Il permet également à l'utilisateur de faire glisser le ScrollView même s'il commence un glissement sur le ViewPager, mais le glissement horizontal sur le pager fonctionnera toujours sans que le ScrollView n'interfère.Cela fonctionne pour moi avec la bibliothèque Android Support v4 sur Android 2.3.4 et 4.2.1.
la source
J'ai adapté la solution de @Michael Herbig L'avantage de cela est que cela fonctionne sur n'importe quelle vue qui le permet
setOnTouchListener
, pas seulement un ViewPager (par exemple ViewPagerIndicator) et c'est une classe autonome.Exemple d'utilisation:
Et la classe:
la source
}
@Override public boolean onTouch (View v, événement MotionEvent) {
Utilisez plus de deux et cela fonctionnera très bien. J'ai également utilisé dans mon code.
la source
Donc, avec cette approche, je laisse le
ViewPager
défilement dans laX
direction sans avoir à m'inquiéter du fait que leScrollView
(parent) vole l'événement et annule le défilement actuel. Plus important encore, cela laisse également la zone oùViewPager
se trouve le défilement dans laY
direction.la source
Aucune des solutions ici n'a bien fonctionné pour moi parce que c'est soit la modification de
ViewPager
la logique tactile de 's ou la logique deScrollView
' s. J'ai dû mettre en œuvre les deux, maintenant cela fonctionne comme un charme.la source
Vous pouvez remplacer la méthode instantiateItem dans votre classe PagerAdapter en ajoutant un scrollView à chaque page. Voici un code:
la source