在viewpager交换片段
我有3个片段,我的一个FragmentPagerAdapter ViewPager:
I have a ViewPager with 3 Fragments and my FragmentPagerAdapter:
private class test_pager extends FragmentPagerAdapter {
public test_pager(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
return fragments[i];
}
@Override
public long getItemId(int position) {
if (position == 1) {
long res = fragments[position].hashCode()+fragment1_state.hashCode();
Log.d(TAG, "getItemId for position 1: "+res);
return res;
} else
return fragments[position].hashCode();
}
@Override
public int getCount() {
return fragments[2] == null ? 2 : 3;
}
@Override
public int getItemPosition(Object object) {
Fragment fragment = (Fragment) object;
for (int i=0; i<3; i++)
if (fragment.equals(fragments[i])){
if (i==1) {
return 1; // not sure if that makes a difference
}
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
}
在页面中的一个(#1),我不断改变片段被显示。我删除旧片段的方法是这样的:
In one of the page (#1), I keep changing the fragment to be displayed. The way I remove the old fragment is like this:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().remove(old_fragment1).commit();
和则只是改变的值片段[1]
我发现我真的不能添加
或替换
新一或会抱怨ViewPager试图用另一个标签添加它太...(我在这里做得不对?)
I found that I cannot really add
or replace
the new one or it will complain the ViewPager is trying to add it too with another tag... (am I doing something wrong here?)
我所显示的片段具有 setRetainInstance(真);
在其的onCreate
函数
All the fragments I display have setRetainInstance(true);
in their onCreate
function.
我的问题是,这通常非常适用于前几个替代品,但后来当我尝试重用片段,有时(我还没有真正想通了的模式,同样的片段可能会显示多次出现这种情况之前)它只会显示一个空白页。
My problem is that this usually works well for the first few replacement, but then when I try to reuse a fragment, sometimes (I have not really figured out the pattern, the same fragment may be displayed several times before this happens) it will only show a blank page.
下面是我发现在我的片段的回调函数发生了,我想显示当问题发生:
Here is what I have found happened in the callback functions of my Fragment I am trying to display when the problem happens:
-
onAttach
被称为(但在那个时候,getView仍然是空) -
onCreateView
不叫(这是预期) -
onViewStateRestored
不叫(为什么不呢?) -
onResume
不叫(我真的认为它会...)
-
onAttach
is called (but at that time, getView is still null) -
onCreateView
is not called (that's expected) -
onViewStateRestored
is not called (why not?) -
onResume
is not called (I really thought it would...)
如果它改变任何东西,我使用的支持包,我的活动是 SherlockFragmentActivity
If it changes anything, I am using the support package, my activity is a SherlockFragmentActivity
修改(回答Marco的评论)
EDIT (to answer Marco's comment):
该片段在活动的OnCreate函数实例化,我填一个ArrayList与那些片段:
The fragments are instantiated in the onCreate function of the Activity, I fill an ArrayList with those fragments:
char_tests = new ArrayList<Fragment>(Arrays.asList(
new FragmentOptionA(), new FragmentOptionB(), new FragmentOptionC()));
该我从列表中选择设置片段[1]
(这是所有在UI线程中完成)
The I pick from that list to set fragments[1]
(that's all done in the UI thread)
我解决了这个问题,通过改变test_pager到延伸的 FragmentStatePagerAdapter 来代替。
I fixed this by changing test_pager to extends FragmentStatePagerAdapter instead.
我仍然困惑,什么 PagerAdapter
应根据使用情况使用。我可以在文档中找到的唯一的事情说 FragmentPagerAdapter
为更好地的,将被保存在内存中的页面数量较少和 FragmentPagerStateAdapter
的页面数量较多,他们将被销毁,并节省内存更好的...
I am still confused as to what PagerAdapter
should be used depending on the usage. The only thing I can find in the documentation says that FragmentPagerAdapter
is better for smaller number of pages that would be kept in memory and FragmentPagerStateAdapter
better for a larger number of pages where they would be destroyed and save memory...
在试图做(看中?)事情片段,我发现 FragmentStatePagerAdapter
是更好的被删除时,页面和重新插入像在这种情况下。而FragmentPagerAdapter是更好时,页面移动位置(见错误37990 一>)
When trying to do (fancy?) things with Fragments, I found FragmentStatePagerAdapter
is better when pages are removed and re-inserted like in this case. And FragmentPagerAdapter is better when pages move position (see bug 37990)