问题描述一:
在使用viewpager+fragmentpageradapter ,起始fragment为A(页面内容比较多,外层是一个scrollview,里层含有一些控件和一个ListView) 切换到相邻的fragmentB(fragmentB内容只有一个ScrollView+ListView) 然后再切换到A,刚开始发现fragmentA内容是fragmentB的内容,这一问题我很困惑。正如你所知道,切换fragment时,会先从fragmentmanager中找是否已经缓存的fragment,有的话直接取出来而不进行重新生成fragment操作,即便是这样也不应该出现这个错误,只要我fragmentmanager中缓存的fragment是正确的,不应该出现这个问题。
我在网上搜索了一下,发现基本都是更新问题,不是我要的答案。
因此我自己换了几个fragment进行测试,发现fragmentA和fragmentC或D相邻就不会产生这个问题,fragmentB和fragmentC或者D相邻也不会产生这个问题。再一次测试FragmentA和FragmentB之间切换,一个不经意,我滑动了一下FragmentA,发现FragmentA中的内容并不是fragmentB的内容,只不过是FragmentA的scrollview没有滑动到顶端。
解决办法一:
我通过将ScrollView中的第一个控件设置焦点(通过设置focusable="true"、focusableintouchmode=“true”),顺利的将FragmentA中的ScrollView移动到顶端。无论怎么切换Fragment,FragmentA中的ScrollView都能顺利移动到顶端(原来是在代码中利用smoothscroto(0,0)方法将scrollview移动到顶端,但是由于viewpager中fragment缓存,导致Fragment不执行生命周期)。
问题描述二:
解决完上一个问题后,问题又来了,从FragmentA切换到FragmentC,再切换回FragmentA,FragmentA中内容重新加载,并且ScrollView移动到顶端。这不满足我的要求,首先FragmentA中内容我不希望重新加载,其次,我之前浏览过FragmentA,切换之后,我希望FragmentA停留在我之前浏览的地方。
解决方法二:
方法一: 我利用 ViewPager pager; pager.setOffscreenPageLimit(3); 方法缓存更多的Fragment。 pager.setOffscreenPageLimit(3);能缓存4个fragment。这样从fragmentA切换到FragmentC再切换回来就不会重新加载fragmentA。fragmentA中的界面自然而然的停留在我之前浏览地方。
方法二:
做一个fragment view缓存,转至:http://my.oschina.net/u/1424386/blog/341486
private
View rootView;
//缓存Fragment view
@Override
public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if
(rootView==
null
){
rootView=inflater.inflate(R.layout.tab_fragment,
null
);
}
//缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错 误。
ViewGroup parent = (ViewGroup) rootView.getParent();
if
(parent !=
null
) {
parent.removeView(rootView);
}
return
rootView;
}
上面两种方法各有各的好处。