2014-09-30 2 views
0

У меня есть TabsPagerAdapter класс, который распространяется FragmentPagerAdapter. Я использую его для заполнения 3 вкладок. Все три представления - это фрагменты.Фрагмент onCreateView не называется

Это, как они определены

public class DonorSearchFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

public class DonorResultsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

public class CampDonorResultsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

Этих фрагментов (как вкладки) инстанцируется из TabsPagerAdapter класса, как показано ниже

public class TabsPagerAdapter extends FragmentPagerAdapter { 

    private ArrayList<Fragment> fragments; 

    public TabsPagerAdapter(FragmentManager fm) { 
     super(fm); 
     fragments = new ArrayList<Fragment>(); 
     fragments.add(Constants.SEARCH_TAB_POSITION, new DonorSearchFragment()); 
     fragments.add(Constants.DONORS_TAB_POSITION, new DonorResultsFragment()); 
     fragments.add(Constants.CAMP_DONORS_TAB_POSITION, new CampDonorResultsFragment()); 
    } 
    ... 
} 

и MainActivity, я инстанцировать TabsPagerAdapter класса который был указан выше

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, DonorSearchFragment.ResultsChangedListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     tabsPagerAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(tabsPagerAdapter); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 
     } 
     .. 
    } 
} 

Удивительно, что третья вкладка (т.е. CampDonorResultsFragment) onCreateView() не вызывается даже после создания экземпляра, как указано выше. В результате, если я вызываю какой-либо метод на этом фрагменте, все переменные (создаваемые в onCreateView()) равны null, и я получаю исключение Null Pointer.

Что именно происходит здесь, почему onCreateView() не вызывается перед вызовом какого-либо метода на этот фрагмент. Кроме того, почему это не происходит на второй вкладке (DonorResultsFragment) выше.

+0

пост 'TabsPagerAdapter' полностью !! – mmlooloo

ответ

2

View пейджер только сохраняет текущую страницу, а также ряд предыдущих/следующих страниц, как указано на off-screen page limit, который по умолчанию 1.

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

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

+0

Вы правы, setOffscreenPageLimit() действительно работает. Однако, как вам было предложено использовать методы для фрагмента из MainActivity, следует избегать. По моему сценарию, я все еще пытаюсь понять то же самое. Как правило, каким образом фрагмент генерирует некоторые данные и переходит к MainActivity, который затем, в свою очередь, переходит к другим фрагментам. – Jatin

+0

Для этого вы можете использовать сортировку событий (например, Otto) для развязки производителей данных и потребителей. – laalto

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