2016-03-10 3 views
1

Создал класс, который реализует FragmentStatePagerAdapter и предоставляет функцию @Override public Fragment getItem(int position), в которой я только создаю и перенастраиваю экземпляр фрагмента.Изменение или замена фрагментов в ViewPager

Тогда у меня есть две функции, которые просто меняют текущую страницу в ViewPager.

public void next() { 
    this.mPager.setCurrentItem(this.mPager.getCurrentItem() + 1); 
} 

public void prev() { 
    this.mPager.setCurrentItem(this.mPager.getCurrentItem() + 1); 
} 

Поэтому, когда страница становится изменилась, я не получаю вызов внутри каких-либо функций жизненного цикла, так что я могу принять любое решение, когда страница становится видимой, скрытым и т.д. ...

Вопрос

  1. Как правильно реализовать ViewPager для мастера вещей (например, регистрации или опроса)

  2. Также я прочитал что-то вроде кода ниже для правильного изменения/замены фрагментов. Но как это можно использовать с ViewPager?

Пожалуйста, дайте мне знать,

FragmentManager fragmentManager = getFragmentManager(); 
fragmentManager.beginTransaction() 
       .replace(R.id.content_frame, fragment) 
       .commit(); 
+0

Проверьте эту ссылку https://dzone.com/articles/android-tutorial-using и перепроверьте реализацию вашего представления пейджера –

+0

проверьте это http://developer.android.com/training/animation/screen-slide.html – Gaurav

+0

@VivekMishra Я проверил ссылку, которую вы поделили, но мои вопросы остались без ответа. У меня есть рабочий код, но я хочу получить вызов жизненного цикла, когда мои взгляды заменяются ViewPager и FragmentManger. – dearvivekkumar

ответ

0

FragmentStatePagerAdapter по умолчанию фрагмент смежно предварительных нагрузок, что и показывает фрагмент.

означает, что если фрагмент 0 показывает фрагмент 1, он также загружается вместе с ним. Аналогично, если фрагмент 5 показывает, то 4 и 6 также будут загружены вместе с ним.

поэтому, когда вы двигаетесь с 4 до 5, жизненный цикл 5 не называется так, как его уже называли.

Вам необходимо реализовать OnPageChangeListener, чтобы определить изменение.

+0

спасибо за ответ. Не могли бы вы рассказать мне, где добавить «OnPageChangeListener». Я думаю, на класс 'ViewPager' ... ??? – dearvivekkumar

+0

Также, когда фрагмент 5 показан после перехода от 1 до 5, необходимо вызвать методы фрагментов 1, 2, 3 OnDestroy()? – dearvivekkumar

+0

как добавить слушателя -> http: // stackoverflow.com/questions/11293300/define-when-a-viewpager-changes-pages – Ankit

0

Попробуйте это:

В OnCreate(),

pager = (ViewPager) findViewById(R.id.pager); 
adapter = new MyPagerAdapter(getSupportFragmentManager()); 
pager.setAdapter(adapter); 
// Here you can specify how many pages(Fragments) to load. 
pager.setOffscreenPageLimit(3); 
pager.setPageMargin(pageMargin); 

// Setting PageChangeListener...   
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() 
{ 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
    { 

    } 

    @Override 
    public void onPageSelected(int position) 
    { 
     // Here, you have a current selected page 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) 
    { 

    } 
});  

// This method is used to get the current selected fragment from `ViewPager` 
private YourFragment getCurrentFragment() 
{ 
    YourFragment fragment = (YourFragment) adapter.getRegisteredFragment(pager.getCurrentItem()); 
    return fragment; 
} 

Теперь FragmentStatePagerAdapter код

public class MyPagerAdapter extends FragmentStatePagerAdapter 
{ 
    // Titles of the fragments 
    private final String[] TITLES = { ... }; 
    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

    public MyPagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) 
    { 
     return TITLES[position]; 
    } 

    @Override 
    public int getCount() 
    { 
     return TITLES.length; 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     if (position == 0) 
     { 
      return Fragment1.newInstance(position); 
     } 
     else if (position == 1) 
     { 
      return Fragment2.newInstance(position); 
     } 
     else if (position == 2) 
     { 
      return Fragment3.newInstance(position); 
     } 
     return Fragment4.newInstance(position); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) 
    { 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     registeredFragments.put(position, fragment); 
     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) 
    { 
     registeredFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 

    public Fragment getRegisteredFragment(int position) 
    { 
     return registeredFragments.get(position); 
    } 
} 

Надеется, что это поможет вам.

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