【发布时间】:2014-03-30 06:35:19
【问题描述】:
所以,我正在尝试使用 Android 支持 v4 库中的 ViewPager,但它(或 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();
}
}
现在,我认为这已经足够了,我可以继续使用 Fragments 通常实现的 onCreateView 方法来实现 MyDataFragment。但是我遇到了一个有趣的问题。当我离开 Activity,然后回到它时,ViewPager 会显示为空白。不知何故,它通过调用 findFragmentByTag 来重用 Fragment,然后根本不调用 getItem 等。更糟糕的是,Fragment 不会收到 onCreateView 事件。所以我想我可以通过将我的onCreateView 代码移动到onAttach 来利用ViewPager 的片段缓存,该代码主要获取对片段膨胀的各种视图的引用。唯一的问题是,在onAttach 期间,MyDataFragment 的getView 方法总是返回null。在线片段的所有示例都描述了onCreateView 应该具有您的所有视图设置代码。好的。但是,当我创建像MyDataFragment.setSomeField(String value) 这样的方法时,我需要使用对TextView 的引用。由于 onCreateView 并不总是被调用(例如,当 FragmentPagerAdapter 神奇地回收 Fragments 时),最好在 onAttach 中获取该引用。但是,在onAttach 期间,Fragment 的根视图仍然为空(可能是因为一开始没有调用onCreateView)!之后没有其他事件发生(onActivityCreated 除外,它与 Fragment 本身无关),所以没有地方可以做设置代码。这应该如何工作?是我遗漏了什么重要的东西,还是这个 Fragment 系统是猴子设计的?
【问题讨论】:
标签: android-fragments android-viewpager fragmentpageradapter