Итак, я пытаюсь использовать ViewPager из библиотеки поддержки Android v4, но есть некоторые серьезные проблемы с тем, как это (или FragmentPagerAdapter) имеет дело с фрагментами. Например, я подклассы FragmentPagerAdapter сделать следующее:Как бороться с FragmentPagerAdapter, повторно использующим фрагменты?
public class MyPagerAdapter extends FragmentPagerAdapter
{
private ArrayList<Fragment> fragments = null;
private ArrayList<Data> data = null;
public MyPagerAdapter(FragmentManager fragmentManager, ArrayList<Data> data)
{
super(fragmentManager);
this.data = data;
fragments = new ArrayList<Fragment>();
for(Data datum : data)
{
MyDataFragment fragment = new MyDataFragment();
fragment.setData(datum);
fragments.add(fragment);
}
}
@Override
public Fragment getItem(int i)
{
return fragments.get(i);
}
@Override
public int getCount()
{
return fragments.size();
}
}
Теперь, я думал, что это было бы достаточно, и что я мог бы пойти дальше и реализовать MyDataFragment
с использованием метода onCreateView
, что фрагменты, как правило, реализации. Но у меня возникла интересная проблема. Когда я перейду от Activity, а затем вернусь к нему, ViewPager появится пустым. Каким-то образом это было повторное использование фрагментов, вызвав findFragmentByTag, а затем просто не вызвав getItem
и т. Д. Что еще хуже, Фрагмент не получит никакого события onCreateView
. Поэтому я решил, что могу использовать кэширование фрагмента ViewPager, переместив код onCreateView
, который в основном захватывает ссылки на различные виды фрагмента, раздуваемые, до onAttach
. Единственная проблема заключается в том, что во время onAttach
метод MyDataFragment getView
всегда возвращает значение null. Все примеры для Fragments online описывают, что onCreateView
должен иметь весь ваш код настройки. Хорошо. Но тогда, когда я создаю такой метод, как MyDataFragment.setSomeField(String value)
, мне нужно использовать ссылку на TextView
. Поскольку onCreateView
не всегда вызывается (например, когда фрагменты магически перерабатываются FragmentPagerAdapter, например), лучше взять эту ссылку в onAttach
. Однако во время onAttach
корневой вид фрагмента по-прежнему равен нулю (вероятно, потому, что onCreateView
не был вызван в первую очередь)! После этого никаких дополнительных событий не происходит (за исключением onActivityCreated
, что не имеет ничего общего с самим фрагментом), поэтому нет необходимости делать установочный код. Как это должно работать? Я пропустил что-то важное здесь, или была система Фрагмента, разработанная обезьяной?