我在一些Android代码中进行了一些重构,其中我将FragmentPagerAdapter与ViewPager一起使用,直接连接到Activity。然后,将FragmentPageAdapter从Activity移动到单独片段(现在是该活动的子节点),作为重构的一部分。在片段中使用FragmentPagerAdapter
这个改变并不顺利。例如,缓存的标签在方向更改后会消失。 NullPointerExceptions在我的Fragment子类中的所有地方被抛出,因为findViewById无法找到它的View组件(看起来像Fragments的View层次在旋转改变后以某种方式被破坏)。
我正在使用最新版本的Android支持库。
任何想法出了什么问题?
编辑:
我目前的执行情况:
public class TabsPageAdapter extends FragmentPagerAdapter {
...
@Override
public Fragment getItem(int index) {
// tabs = list of Fragment instances created in contructor of pager adapter - bad habbit?
return tabs.get(index).getTabFragment();
}
...
}
public class StatsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.stats_view, container, false);
TabsPageAdapter adapter = new TabsPageAdapter(getActivity().getSupportFragmentManager(), getActivity());
ViewPager viewPager = (ViewPager) root.findViewById(R.id.tabPager);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(3);
TabPageIndicator pageIndicator = (TabPageIndicator) root.findViewById(R.id.tabIndicator);
pageIndicator.setViewPager(viewPager);
return root;
}
}
public class MedalsTab extends Fragment {
private MedalAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.medals, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
this.adapter = new MedalAdapter();
GridView gridView = (GridView) getActivity().findViewById(R.id.grdMedals);
// Nullpointerexception is thrown here
gridView.setAdapter(adapter);
}
@Override
public void onSaveInstanceState(Bundle outState) {
//first saving my state, so the bundle wont be empty.
//http://code.google.com/p/android/issues/detail?id=19917
outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
super.onSaveInstanceState(outState);
}
...
}
我也越来越此异常,同时通过在寻呼机适配器选项卡刷卡。
E/AndroidRuntime(28706): java.lang.NullPointerException
E/AndroidRuntime(28706): at android.support.v4.app.Fragment.instantiate(Fragment.java:391)
我附上当前代码 – bjorncs 2013-03-04 08:20:19