Fragment报java.lang.IllegalStateException: Recursive entry to executePendingTransactions 。

原本的程序是在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跳转的方法
Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 设置循环监听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
Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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);
}

Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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的。用了库之后就不行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值