FragmentStatePagerAdapter 第一次调用 getItem 错误 sdk 22-->23 升级
FragmentStatePagerAdapter first call to getItem wrong with sdk 22-->23 upgrade
更新 2:删除所有 v4 支持参考修复了它。
更新:我从头开始查看触发此行为的原因。一旦我添加了对位置权限的检查,它就会发生。我不能倒退——即使我删除了所有权限代码,它仍然保留在错误行为的 FragmentStatePagerAdapger 中。
在我使用 appcompat-v7:23.2.1 将 compileSdkVersion 和目标 SdkVersion 从 22 更改为 23 之前,我有一个 FragementStatePagerAdapter 对于动态创建的片段的 ViewPager 工作得很好。现在,如果我尝试加载,比如说,A、B、C,它会加载 B、B、C。但是如果我向后滑动,我会得到 C、B、A。所以这只是加载动态创建的片段 A 的初始尝试那是不成功的。
这是我设置适配器和 viewpager 的方式:
myAdapter = new MyAdapter(getSupportFragmentManager(), numItems);
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(myAdapter);
viewPager.setCurrentItem(position);
我的适配器:
private class MyAdapter extends FragmentStatePagerAdapter {
private final int size;
public MyAdapter(FragmentManager fm, int _size) {
super(fm);
size = _size;
}
@Override
public int getCount() {
return size;
}
@Override
public Fragment getItem(int position) {
String _id = myArray[position];
return MyFragment.newInstance(_id);
}
}
并实例化片段:
public static MyFragment newInstance(String _id) {
final MyFragment f = new MyFragment();
final Bundle args = new Bundle();
args.putString("_id", _id);
f.setArguments(args);
return f;
}
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_id = getArguments().getString("_id");
}
有没有其他人在升级后遇到过这种情况?在我的轮子上旋转了几个小时后,我完全不知所措。
我作为评论发布的想法解决了这个问题,这里是相同的答案,但有更多细节...
简短版本:在从 FragmentStatePagerAdapter
派生的适配器中,尝试使用 FragmentManager
而不是 SupportFragmentManager
。 除非您 100% 确定您需要 SupportFragmentManager
。
解释:
问题中的代码看起来不错。 adapter
唯一可以 'confuse' 碎片的地方是方法 instantiateItem(ViewGroup container, int position)
。此方法使用 FragmentManager
作为 constructor 的参数传递。所以我们可以责怪那个可疑的 SupportFragmentManager
.
要从 DmitryO 添加到 ,如果您使用 android.app.Fragment
,则应使用 FragmentManager,如果您使用 android.support.v4.app.Fragment
,则应使用 SupportFragmentManager,就这么简单。
两者都可以与支持库结合使用,即您可以将任一类型的 Fragment 放入 AppCompatActivity 中。
另请注意,如果您想将 android.app.Fragment
原生片段与 FragmentPagerAdapter 或 FragmentStatePagerAdapter 一起使用,则需要使用适配器的 v13 支持库版本,即 android.support.v13.app.FragmentStatePagerAdapter
.
请注意,这最初是作为评论发布的,但我不希望此信息丢失。
更新 2:删除所有 v4 支持参考修复了它。 更新:我从头开始查看触发此行为的原因。一旦我添加了对位置权限的检查,它就会发生。我不能倒退——即使我删除了所有权限代码,它仍然保留在错误行为的 FragmentStatePagerAdapger 中。
在我使用 appcompat-v7:23.2.1 将 compileSdkVersion 和目标 SdkVersion 从 22 更改为 23 之前,我有一个 FragementStatePagerAdapter 对于动态创建的片段的 ViewPager 工作得很好。现在,如果我尝试加载,比如说,A、B、C,它会加载 B、B、C。但是如果我向后滑动,我会得到 C、B、A。所以这只是加载动态创建的片段 A 的初始尝试那是不成功的。
这是我设置适配器和 viewpager 的方式:
myAdapter = new MyAdapter(getSupportFragmentManager(), numItems);
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(myAdapter);
viewPager.setCurrentItem(position);
我的适配器:
private class MyAdapter extends FragmentStatePagerAdapter {
private final int size;
public MyAdapter(FragmentManager fm, int _size) {
super(fm);
size = _size;
}
@Override
public int getCount() {
return size;
}
@Override
public Fragment getItem(int position) {
String _id = myArray[position];
return MyFragment.newInstance(_id);
}
}
并实例化片段:
public static MyFragment newInstance(String _id) {
final MyFragment f = new MyFragment();
final Bundle args = new Bundle();
args.putString("_id", _id);
f.setArguments(args);
return f;
}
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_id = getArguments().getString("_id");
}
有没有其他人在升级后遇到过这种情况?在我的轮子上旋转了几个小时后,我完全不知所措。
我作为评论发布的想法解决了这个问题,这里是相同的答案,但有更多细节...
简短版本:在从 FragmentStatePagerAdapter
派生的适配器中,尝试使用 FragmentManager
而不是 SupportFragmentManager
。 除非您 100% 确定您需要 SupportFragmentManager
。
解释:
问题中的代码看起来不错。 adapter
唯一可以 'confuse' 碎片的地方是方法 instantiateItem(ViewGroup container, int position)
。此方法使用 FragmentManager
作为 constructor 的参数传递。所以我们可以责怪那个可疑的 SupportFragmentManager
.
要从 DmitryO 添加到 android.app.Fragment
,则应使用 FragmentManager,如果您使用 android.support.v4.app.Fragment
,则应使用 SupportFragmentManager,就这么简单。
两者都可以与支持库结合使用,即您可以将任一类型的 Fragment 放入 AppCompatActivity 中。
另请注意,如果您想将 android.app.Fragment
原生片段与 FragmentPagerAdapter 或 FragmentStatePagerAdapter 一起使用,则需要使用适配器的 v13 支持库版本,即 android.support.v13.app.FragmentStatePagerAdapter
.
请注意,这最初是作为评论发布的,但我不希望此信息丢失。