2016-12-14 2 views
0

Мне нужно знать жизненный цикл фрагментов внутри ViewPager? У меня есть ViewPager из 3 вкладок (3 фрагмента) Каков жизненный цикл при прохождении между ними?Как обновить данные в фрагментах ViewPager?

Я замечаю, что когда я перехожу из Фрагмента 3 в Фрагмент 1, он обновляется. так какой метод в жизненном цикле называется в этот момент?

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

Я предполагаю, что это `onActivityCreated(), но, чтобы назвать это, я должен передать Bundle saveInstancestate. Когда я передаю null, он падает, поэтому как получить этот объект?

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

Thanks

+0

Использует ли метод getItem адаптера пейджера новые экземпляры фрагментов? –

+0

ничего не делает – kerollos

+0

Что значит ничего не делать? Он должен вернуть представление или фрагмент (возможно, фрагмент в вашем случае). –

ответ

1

Фрагмент пейджера просмотра всегда загружает своих соседей с обеих сторон.

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

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

public class ViewPagerActivity implements ViewPager.OnPageChangeListener { 

    public void onCreate(Bundle savedInstanceState) { 
     ... 
     if (savedInstanceState != null) { 
      //Restore the fragment's instance 
      mContent = getSupportFragmentManager().getFragment(savedInstanceState, "mContent"); 
      ... 
     } 
     ... 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     //Save the fragment's instance 
     getSupportFragmentManager().putFragment(outState, "mContent", mContent); 
    } 


    // regular activity stuff plus view pager methods 

    @Override 
    public void onPageSelected(int arg0) { 
     final ReadyFragment fragment = mAdapter.getItem(arg0); 
     if (fragment.isVisible()) { 
      fragment.ready(); //method inside your custom fragment code 
     } 
    } 
} 

Добавить класс интерфейса:

public interface ReadyInterface { 
    public void ready(); 
} 

реализовать этот интерфейс в своих фрагментах:

public class ReadyFragment extends Fragment implements ReadyInterface { 

    //.. your regular fragment stuff 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ... 
    if (savedInstanceState != null) { 
     //Restore the fragment's state here 
    } 
} 
... 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    //Save the fragment's state here 
    } 

    @Overide 
    public void ready() { 
    // do your stuff here that needs to happen 
    //once fragment is displayed and running 
    } 

} 
+0

извините, я не понимаю вашу точку зрения. – kerollos

+0

Ответ объясняет, как точно знать, когда фрагмент работает и отображается. Просмотр пейджера уничтожает и постоянно создает фрагменты. –

+0

Я добавил материал для сохранения и восстановления состояния фрагмента –

0

В вашей деятельности, после того, как вы установите адаптер для просмотра пейджера, поместите код для любого метода onPageSelected(). Он называется каждый раз, когда вы меняете или прокручиваете viewPager.

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 

      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 

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

  • Нет связанных вопросов^_^