原本的程序是在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跳转的方法
首页的ViewPager
第三个Fragment实现ViewPager
我个人估计可能跟这个getChildFragmentManager和getFragmentManager有很大的关系,但是ViewPager只能形成一次我就不明白了。我之前没用第三方库的时候是可以通过getChildFragmentManager实现Fragment嵌套Viewpager+Fragment的。用了库之后就不行了。
主程序实现Fragment跳转的方法
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
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
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);
}
|
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的。用了库之后就不行了。