做翔翔财富的财富超市页面折腾了很久,一开始是打算在_WealthMarketFragment里放一个ViewPager,然后在ViewPager里放两个Fragment:
一.在_WealthMarketFragment的xml中添加Viewpager
<span style="font-size:10px;"><android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </span>
二.写两个完整可用的Fragment(即包括他们的xml),比如WeeklyEarnFragment和MonthlyEarnFragment,此处就不贴代码了
三._WealthMarketFragmentt中自定义一个FragmentStatePagerAdapter(viewpager适配器),并给该ViewPager设置适配器,关键代码如下
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mSlidingTabAdapter = new SlidingTabAdapter(this); //new一个自定义的ViewPager适配器
mViewPager.setAdapter(mSlidingTabAdapter); //为ViewPager设置适配器
mViewPager.setOffscreenPageLimit(2); //指定ViewPager加载的页数
mViewPager.setCurrentItem(0); //设置当前的Fragment
restartLoader();
}
@Override
public void onChangeFragment(int checkedId) { //这是回调函数,在其他activit设置当前的Fragment
if (checkedId==R.id.weekly_earn){
mViewPager.setCurrentItem(TAB_WEEKLY_EARN);
}else if (checkedId==R.id.monthly_earn){
mViewPager.setCurrentItem(TAB_MONTHLY_EARN);
}
}
public class SlidingTabAdapter extends FragmentStatePagerAdapter { //自定义FragmentStatePagerAdapter类,基本只需重写下面三个方法
public SlidingTabAdapter(Fragment fm) {
super(fm.getChildFragmentManager()); //注意此处!!由于是在Fragment中使用FragmentManager,只能使用getChildFragmentManager
}
@Override
public Fragment getItem(int position) {
switch (position) {
case TAB_WEEKLY_EARN:
if (weeklyEarnFragment == null)
weeklyEarnFragment = WeeklyEarnFragment.newInstance();
return weeklyEarnFragment;
case TAB_MONTHLY_EARN:
if (monthlyEarnFragment == null) monthlyEarnFragment = MonthlyEarnFragment.newInstance();
return monthlyEarnFragment;
}
return new Fragment();
}
@Override
public int getCount() { //ViewPager中item数量
return 2;
}
}
其中的一个坑就是FragmentManager,在Activity中获取
FragmentManager可以使用getFragmentManager方法或者getSupportFragmentManager方法,但在Fragment中嵌套Fragment只能使用getChildFragmentManager。
就这样,我们成功的完成了Fragment中放ViewPager,ViewPager中包含两个Fragment,但此时运行出来后问题出现了,由于HomeActivity中包含四个Fragment并且可以滑动,_WealthMarketFragment本身就是属于HomeActivity的一个子Fragment,那我在_WealthMarketFragment中加了个ViewPager,相当于加了两个Fragement,这样的话相当于有五个Fragment可以滑动......这不是需求所希望的,需求希望只有四个Fragment可以滑动,而_WealthMarketFragment中的两个Fragment则是通过ToolBar中的CheckBox点击切换,这么一想,我理所当然的去查找禁止ViewPager滑动的方法,得到的结论是自定义ViewPager并重写其中的方法:
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
//重写以下两个方法,使触摸没有反应
@Override
public boolean onTouchEvent(MotionEvent event) {
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return false;
}
}
天真的以为这样就可以了,结果运行出来虽然 _WealthMarketFragment确实被禁止滑动了,但在切换HomeActivity的 _WealthMarketFragment到其他的Fragment时很难切换,因为_WealthMarketFragment被禁止滑动了......
只能重新想个办法了,灵机一动,为什么不用最简单的方式呢,既然_WealthMarketFragment中的两个tab内容基本全部相同,那我根据不同的tabId在_WealthMarketFragment中分别进行两次请求不就好了?于是在_WealthMarketFragment中写了两个网络请求,根据CheckBox来判断请求哪一个,运行出来后居然可以,还是蛮欣慰的,但是把网一断,没有网络请求,由于只有一个Fragment实例,所以切换tab依然还是显示断网前的样子,这怎么行.....问Leo,Leo说你新建一个ChildFragment,把网络请求写里面,然后在_WealthMarketFragment中新建两个ChildFragment的实例,切换tab的时候切换Fragment就好了。好有道理...我怎么就没想到,下面贴出切换Fragment的方法:
一.在_WealthMarketFragment的xml中加一个FrameLayout,仅仅是为了给ChildFragment一个父布局,使其可以添加进去
<FrameLayout
android:id="@+id/fragment_parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
二.切换Fragment的方法
FragmentManager fm = getChildFragmentManager(); //得到FragmentManager,前车之鉴,<span style="font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">getChildFragmentManager</span><span style="font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">这次不会掉坑</span>
FragmentTransaction ft = fm.beginTransaction(); //得到FragmentTransaction
wealthMarketChildFragmentWeekly = WealthMarketChildFragment.newInstance(TAB_WEEKLY_EARN);
ft.replace(R.id.fragment_parent, wealthMarketChildFragmentWeekly); //在父布局中切换Fragment
ft.commit(); //提交FragmentTransaction
总算是搞定了,说到底就是对Fragment的理解不够,不过总是有收获的,比如再次在Fragment中得到FragmentManager,我知道了要用getChildFragmentManager方法。