我在一些Android代码中进行了重构,其中我使用了FragmentPagerAdapter和ViewPager在一个直接连接到Activity的视图中。作为重构的一部分,FragmentPageAdapter从Activity移动到了单独的Fragment(现在是该Activity的子Fragment)。
这个改变并不好。例如,在方向改变后,缓存的标签会消失。我的Fragment子类中到处都抛出NullPointerException,因为findViewById无法找到它的View组件(看起来像是Fragment的View层次结构在旋转改变后被销毁了)。
我正在使用最新版本的Android Support Library。
有什么想法是怎么出错的?
编辑:
我目前的实现:
我在使用pager adapter滑动标签时也遇到了这个异常。
这个改变并不好。例如,在方向改变后,缓存的标签会消失。我的Fragment子类中到处都抛出NullPointerException,因为findViewById无法找到它的View组件(看起来像是Fragment的View层次结构在旋转改变后被销毁了)。
我正在使用最新版本的Android Support Library。
有什么想法是怎么出错的?
编辑:
我目前的实现:
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);
}
...
}
我在使用pager adapter滑动标签时也遇到了这个异常。
E/AndroidRuntime(28706): java.lang.NullPointerException
E/AndroidRuntime(28706): at android.support.v4.app.Fragment.instantiate(Fragment.java:391)