4

Hé les gars, j'ai un fragmentPagerAdapter avec 3 fragments dedans. Comment désactiver le glissement entre les 3 fragments afin que l'utilisateur utilise uniquement la tabview pour passer d'un fragment à l'autre?Désactiver glisser dans fragmentPagerAdapter? - android

À la votre!

private class ViewPagerAdapter extends FragmentPagerAdapter 
{ 
    ArrayList<Fragment> fragments = new ArrayList<>(); 
    ArrayList<String> tabTitles = new ArrayList<>(); 

    public ViewPagerAdapter(android.support.v4.app.FragmentManager fragmentManager) 
    { 
     super(fragmentManager); 
    } 
    @Override 
    public Fragment getItem(int position) 
    { 
     return fragments.get(position); 
    } 
    @Override 
    public int getCount() 
    { 
     return fragments.size(); 
    } 
    @Override 
    public CharSequence getPageTitle(int position) 
    { 
     return tabTitles.get(position); 
    } 
    public void addFragments(Fragment fragment, String titles) 
    { 
     this.fragments.add(fragment); 
     this.tabTitles.add(titles); 
    } 
} 
+0

Utilisez les boutons au lieu de l'onglet viewpager et affichez le pager – Noorul

+0

pourquoi utiliser des boutons? La disposition des onglets et le téléavertisseur ont été conçus pour plusieurs fragments. – TheQ

+0

Je pense que l'adaptateur n'aura pas de "dire", il fournira simplement des données au ViewPager. Si vous voulez empêcher le siwping, le ViewPager sera 'responsable' http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still -be-able-to-s – FWeigl

Répondre

5

Vous pouvez configurer un comme téléavertisseur vue personnalisée ceci: -

public class LockableViewPager extends ViewPager { 
private boolean swipeable; 

     

    public LockableViewPager(Context context) { 

        super(context); 

    } 


    public LockableViewPager(Context context, AttributeSet attrs) { 

        super(context, attrs); 

        this.swipeable = true; 

    } 


    @Override 

    public boolean onTouchEvent(MotionEvent event) { 

        if (this.swipeable) { 

            return super.onTouchEvent(event); 

        } 


        return false; 

    } 


    @Override 

    public boolean onInterceptTouchEvent(MotionEvent event) { 

        if (this.swipeable) { 

            return super.onInterceptTouchEvent(event); 

        } 


        return false; 

    } 


    public void setSwipeable(boolean swipeable) { 

        this.swipeable = swipeable; 

    } 

} 

Et puis dans la mise en page, vous pouvez le définir comme: -

<mypackage.lockableviewpager android:id="@+id/photosViewPager" android:layout_height="match_parent" android:layout_width="match_parent"/> 

Et puis il suffit d'appeler

setSwipeable(false) 

Espérons que ça aide.

+0

donc je ne peux pas utiliser FragmentPagerAdapter pour accomplir cela? – TheQ

+0

Je ne pense pas que vous pouvez le faire en utilisant l'adaptateur fragmentpager. Pour autant que je sache, le seul moyen est de définir un pager de vue personnalisé. :) –

+0

Alors, comment pourrais-je définir les titres d'onglet et faire getItem et getCount dans ce viewpager personnalisé? Beacuse dans le fragmentPagerAdapter j'ai getItem, getCount, et getPageTitle – TheQ

3

est ici un peu plus de précisions sur l'exemple de classe LockableViewPager ...

d'abord au lieu de marquer un ViewPager comme celui-ci

<android.support.v4.view.ViewPager 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</android.support.v4.view.ViewPager> 

vous voulez faire une classe personnalisée qui hérite VP comme celui-ci

public class LockableViewPager extends ViewPager { 
    private boolean swipeable; 

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

    public LockableViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.swipeable = true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (this.swipeable) { 
      return super.onTouchEvent(event); 
     } 
     return false; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     if (this.swipeable) { 
      return super.onInterceptTouchEvent(event); 
     } 
     return false; 
    } 

    public void setSwipeable(boolean swipeable) { 
     this.swipeable = swipeable; 
    } 
} 

attention à cette méthode

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (this.swipeable) { 
     return super.onInterceptTouchEvent(event); 
    } 
    return false; 
} 

alors vous pouvez marquer votre classe personnalisée qui agit déjà en tant que ViewPager, plus INTERCEPTIONS événements touchent

<com.YourPackage.LockableViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</com.YourPackage.LockableViewPager> 

Dans la classe java de votre activité qui contient LockableViewPager mis

LockableViewPager viewPager; 
OnCreate() { 
    viewPager = (LockableVewPager) findViewById(R.id.*id of pager*); 
    viewPager.setSwipable(false); 
} 

Extendng la classe que vous voulez (c'est à dire ViewPager) est la manière CORRECTE de faire ceci à moins que vous fassiez une classe totalement différente qui ne se comporte pas de la même manière; * bonne chance