【发布时间】:2011-10-08 22:40:49
【问题描述】:
我有一个包含 ViewPager 的片段。 ViewPager 与包含一组片段的适配器相关联。
在加载父片段时,我遇到了一个 IllegalStateException 消息:java.lang.IllegalStateException: Recursive entry to executePendingTransactions。
一些研究使我得出结论,系统无法在另一个片段中显示片段,但是似乎有迹象表明使用 ViewPager (A bug in ViewPager using it with other fragment) 可以做到这一点。
事实上,如果我向我的父片段添加一个按钮,当按下时在我的 ViewPager 上调用 mPager.setAdapter(mAdapter),则 ViewPager 会成功加载。这并不理想。
那么问题必须与片段生命周期有关。因此,我的问题是: 有没有其他人找到解决这个问题的方法,如果有,如何解决?
有什么方法可以将 ViewPager 上的适配器设置延迟到片段事务之后?
这是我的父片段代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setAdapter(mAdapter);
button.setVisibility(View.GONE);
}
});
mAdapter = new ViewPagerAdapter(getFragmentManager());
// mViewPager.setAdapter(mAdapter);
return mView;
}
还有适配器:
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
Bundle b = createBundle(position, mCursor);
return TeamCardFragment.newInstance(b);
}
}
【问题讨论】:
-
在 Android 支持库的修订版 11 中添加了嵌套片段的功能。 Fragment 类现在具有方法“getChildFragmentManager”。我创建了一个与此类似的简单项目,可以在 github.com/marsucsb/nested-fragments 找到
标签: android android-fragments android-viewpager android-lifecycle android-nested-fragment