ViewPager 出现java.lang.IllegalStateException: Recursive entry to executePendingTr

Just_Fragment 2016-08-24 04:05:54
原本的程序是在MainActivity中实现底部四个按钮菜单,用来切换四个Fragment。其中第一个Fragment(souye)中含有一个ViewPager,第三个Fragment中也包含一个Viewpager。其中ViewPager是用FragmentPagerAdapter作为适配器,再用四个Fragment实现的。现在我把此项目的Libs下的Support V4包删了,关联了Jake的第三方开源框架其有Support v4包。我在第一个Fragment(首页)中使用的Circleindicator,在第三个Fragment中用的Titleindicator,彼此之间用的不同的Adapter和不同的Fragment,但是打开程序只能显示一种ViewPager。比如我默认打开程序显示第一个Fragment就能够显示Clircle的VIEWpager,但是点击第三个Fragment就会报java.lang.IllegalStateException: Recursive entry to executePendingTransactions 。当默认点击第三个Fragment就能显示,但是点击第一个Fragment出现同样的错误。查询网站说把getFragmentManager()改成getChildFragmentManager()即可,修改之后就是报这个错误:java.lang.NoSuchMethodError指向这个getChildFragmentManager。一些关键代码下面贴出来。


主程序实现Fragment跳转的方法

// 设置循环监听ImageView
for (int i = 0; i < imgs.length; i++) {
imgs[i].setEnabled(true);
// 将i参数保存进Tag
imgs[i].setTag(i);
imgs[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// 传出Tag
int item = (Integer) arg0.getTag();
// 设置Fragment的覆盖
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
hideAllFragment(ft);
if (fragments[item] == null) {
initFragment(item);
ft.add(R.id.main_framelayout, fragments[item]);}
else {
ft.show(fragments[item]);
}
// Title标题改变
titletv.setText(titletexts[item]);
ft.commit();
// 菜单按钮变色方法
selectorMenu(item);
}
});


首页的ViewPager

private void initViewpager() {
// 关联子项
souyouviewPager = (ViewPager) getActivity()
.findViewById(R.id.Viewpager);
indicator=(CirclePageIndicator)getActivity().findViewById(R.id.indicator);
// 声明Fragment数组
fragments = new Fragment[4];
fragments[0] = new Souye_viewpager1();
fragments[1] = new Souye_viewpager2();
fragments[2] = new Souye_viewpager3();
fragments[3] = new Souye_viewpager4();
// ViewPager适配器
mAdpater=new MyViewpagerAdpater(getChildFragmentManager());
souyouviewPager.setAdapter(mAdpater);
indicator.setViewPager(souyouviewPager);
// ViewPager滑动监听
indicator
.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// 当监听到滑动时,从当前Item继续定时
flag = arg0;
myHandler.removeMessages(0);
myHandler.sendEmptyMessageDelayed(0, ANIMATION_TIMES);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}

// ViewPager适配器设置
class MyViewpagerAdpater extends FragmentPagerAdapter {

public MyViewpagerAdpater(FragmentManager ftm) {
super(ftm);
}

@Override
public Fragment getItem(int arg0) {
return fragments[arg0];
}

@Override
public int getCount() {
return fragments.length;
}

}

第三个Fragment实现ViewPager

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
init();
}

private void init() {
// 关联控件
mfaxianadapter = new Viewpager_FragmentPagerAdapter(getChildFragmentManager());
viewPager = (ViewPager) getActivity().findViewById(
R.id.Viewpager_faxian);
fxindicator = (TitlePageIndicator) getActivity().findViewById(
R.id.indicator_faxain);

viewPager.setAdapter(mfaxianadapter);
fxindicator.setViewPager(viewPager);
}


public class Viewpager_FragmentPagerAdapter extends FragmentPagerAdapter {
private final String[] text = new String[] { "精选", "生活", "智能", "旅游","数码" };
private Fragment[] fragments;


private void initfragments(){
fragments = new Fragment[5];
fragments[0] = new Fenlei_Activity_1();
fragments[1] = new Fenlei_Activity_2();
fragments[2] = new Fenlei_Activity_3();
fragments[3] = new Fenlei_Activity_4();
fragments[4] = new Fenlei_Activity_5();
}

public Viewpager_FragmentPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int arg0) {
initfragments();
return fragments[arg0];
}

@Override
public int getCount() {
initfragments();
return fragments.length;
}
@Override
public CharSequence getPageTitle(int arg0) {
return text[arg0];
}
}


我个人估计可能跟这个getChildFragmentManager和getFragmentManager有很大的关系,但是ViewPager只能形成一次我就不明白了。我之前没用第三方库的时候是可以通过getChildFragmentManager实现Fragment嵌套Viewpager+Fragment的。用了库之后就不行了。
希望有大神可以帮我解决此类问题。需要源码的可以留邮箱

...全文
147 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Just_Fragment 2016-08-24
  • 打赏
  • 举报
回复
这个问题刚刚解决了,其实都没有错。我导入JAKE的库中Support V4中并没有getChildFragmentManager的方法。Fragment里面嵌套使用Fragment如果用getFragmentManager就会出现java.lang.IllegalStateException: Recursive entry to executePendingTransactions 错误。但是他没用getChildFragmentManager方法,于是我就用我最新的Support v4去替换,替换之后Eclipse没有检测到错误,但是运行其他还是出现错误。其实还是Support v4之间的冲突问题。我又在我删除的Libs目录下也考了分Support v4包就不会错了。具体原因不知道什么原因,但是教会我们如果导第三库的话,先把两个项目的LIbs全删了,在新建一个项目用最新的support v4包在粘贴进去。一般就不会出Support v4冲突。

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧