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

来源:互联网 发布:java中有哪些方法 编辑:程序博客网 时间:2024/04/29 21:41
原本的程序是在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的。用了库之后就不行了。
0 0
原创粉丝点击