4

Эй, ребята, у меня есть fragPagerAdapter с тремя фрагментами в нем. Как бы отключить прокрутку между тремя фрагментами, чтобы пользователь использовал только табуляцию, чтобы идти между фрагментами?Отключить прокрутку в фрагментеPagerAdapter? - android

Cheers!

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

Используйте кнопки вместо вкладки viewpager и просмотр пейджера – Noorul

+0

зачем использовать кнопки? вкладка и просмотр пейджера предназначены для нескольких фрагментов – TheQ

+0

Я думаю, что адаптер не будет «говорить» в этом, он просто предоставляет данные ViewPager. Если вы хотите предотвратить сидение, ViewPager будет «ответственным» http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still -be-able-to-s – FWeigl

ответ

5

Вы можете настроить пользовательский вид пейджера, как это: -

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; 

    } 

} 

А потом в макете вы можете установить его в качестве: -

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

А потом просто позвонить

setSwipeable(false) 

Надеюсь, что это поможет.

+0

, поэтому я не могу использовать FragmentPagerAdapter для этого? – TheQ

+0

Я не думаю, что вы можете сделать это с помощью адаптера fragpager. Насколько я знаю, единственный способ - определить пользовательский пейджер. :) –

+0

Итак, как мне настроить заголовки вкладок и сделать getItem и getCount в этом пользовательском представлении? Beacuse в fragPagerAdapter у меня есть getItem, getCount и getPageTitle – TheQ

3

Вот немного более разработка на примере класса LockableViewPager ...

Во-первых, вместо разметки ViewPager как этого

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

вы хотите сделать пользовательский класс, который наследуется VP как это

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

Обратите внимание на этот метод

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

, то вы можете отметить свой собственный класс, который уже действует как ViewPager плюс перехватывает события касания

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

В Java класс вашей деятельности, которая содержит LockableViewPager набор

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

Extendng класс, который Вы хотите (т.е. ViewPager) является ПРАВИЛЬНЫМ способом сделать это, если вы не делаете совершенно другой класс, который не ведет себя одинаково; * удача

Смежные вопросы