2013-03-06 2 views
1

У меня есть приложение с вкладками, построенное с фрагментами и ActionBarSherlock. У меня 3 вкладки, с 3 ListFragment Вот что происходит.onCreateView не вызывается для вкладок в панели действий TabsAdapter для второй вкладки времени выбран?

Когда я выбираю любую вкладку, метод onCreate для связанного фрагмента вызывается как ожидается в первый раз, но не во втором. Проблема заключается в том, что метод onCreate вызывается для следующей соседней вкладки, но не для выбранной вкладки.

Щелкните по tab2 и onCreate tab3 вызывается, но не tab2.

Фактически мое требование, когда я изменяю некоторые данные в tab1, означает фрагмент1. эти изменения не выполняются в фрагменте2, когда я выбираю tab2 (фрагмент2), это означает, что фрагмент2 onCreate() не вызывал. почему он не обновляет фрагмент должным образом. это адаптер, который я использую.

private class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener { 

    public TabsAdapter(FragmentActivity activity, ActionBar actionBar, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = actionBar; 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, int tabId) { 
     mTabs.add(clss.getName()); 
     mTabsId.add(tabId); 
     mActionBar.addTab(tab.setTabListener(this)); 
     notifyDataSetChanged(); 
    } 

    public Integer getIdForPosition(int position) { 
     if (position >= 0 && position < mTabsId.size()) { 
      return mTabsId.get(position); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return mTabs.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, mTabs.get(position), new Bundle()); 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     Log.i(TAG, "*******tab selected*******" +tab); 
     clearDetails(); 
     if (mViewPager.getCurrentItem() != tab.getPosition()) { 
      mViewPager.setCurrentItem(tab.getPosition(), true); 
     } 
    } 

    @Override 
    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
     if (mCurrentPosition == position) {   
     } 
     mNextPosition = position; 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) {  
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {   
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {   
    } 

ответ

3

От this page:

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

Это означает, что ваши фрагменты, которые не видны пользователю, все еще хранятся в памяти, поэтому их методы onCreate не будут вызываться, когда они будут повторно отображаться. Вы можете заставить их выгнать из памяти при переключении страниц, установив ViewPager's offscreen page limit на 0.

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

+0

я установить этот параметр в моем ViewPager mViewPager.setOffscreenPageLimit (0); хотя это не работает для меня. –

+0

Тогда вам может понадобиться использовать обработчик событий, чтобы заставить эти фрагменты обновляться при вводе в поле зрения.Кроме того, вы можете принудительно создать абсолютно новый экземпляр фрагмента, который будет создан каждый раз в обработчике событий onTabSelected. – majormajors

+0

Я уже делаю это @Override public void onTabSelected (вкладка Tab, FragmentTransaction ft) { Log.i (TAG, вкладка ******* выбрана ******* "+ tab); clearDetails(); if (mViewPager.getCurrentItem()! = Tab.getPosition()) { mViewPager.setCurrentItem (tab.getPosition(), true); } } in onTabSelected() Посмотрите на мой код, что я должен делать дальше этого, чтобы нормально работать. –

1

, когда вы находитесь на Tab: (п), только Tab: (п-1) и Tab: (п + 1) будет жить в памяти, для оптимизации использования памяти. Остальные все вкладки будут уничтожены, вот почему, когда вы вернетесь к первой вкладке, ее onCreateView вызывается снова.

На самом деле Tab: 1 «s onCreateView будет называться даже если вы нажмете Tab: 2 потому, что его Таб окрестности.

Одно из решений я получил это:

Изменение OffscreenPageLimit в ViewPager. Его значение по умолчанию: 1

Попробуйте изменить его на 0. Если work.But в случае, если он не

Использование вызовов поддерживают

@Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 
Смежные вопросы