Fragment的使用

做翔翔财富的财富超市页面折腾了很久,一开始是打算在_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方法。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值