多层Fragment与ViewPager结合使用

效果图如下:
这里写图片描述
如上图蔬菜和水果按钮分别控制两个Fragment,这里要限制ViewPager不可以左右滑动,只能通过按钮实现滑动切换,然后子Fragment中又分别有三个Fragment与一个ViewPager的使用。
在这边直接贴上代码,MainActivity的代码:

package com.zhjy.fragmentdemo.activity;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;

import com.zhjy.fragmentdemo.R;
import com.zhjy.fragmentdemo.adapter.MyPagerAdapter;
import com.zhjy.fragmentdemo.fragment.EmergencyFragment;
import com.zhjy.fragmentdemo.fragment.SurgeryFragment;
import com.zhjy.fragmentdemo.view.NonSwipeableViewPager;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Button mButtonOne,mButtonTwo;
    private NonSwipeableViewPager mViewPager;
    private ArrayList<Fragment> mArrayList;
    private SurgeryFragment mSurgeryFragment;
    private EmergencyFragment mEmergencyFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        init();
    }

    private void init() {
        mButtonOne = (Button)findViewById(R.id.button_one);
        mButtonTwo = (Button)findViewById(R.id.button_two);
        mViewPager = (NonSwipeableViewPager)findViewById(R.id.view_pager);

        mButtonOne.setOnClickListener(mOnClickListener);
        mButtonTwo.setOnClickListener(mOnClickListener);
        if (mArrayList == null){
            mArrayList = new ArrayList<>();
        }
        if (mSurgeryFragment == null){
            mSurgeryFragment = new SurgeryFragment();
        }
        mSurgeryFragment.setmActivity(MainActivity.this);
        if (mEmergencyFragment == null){
            mEmergencyFragment = new EmergencyFragment();
        }
        mEmergencyFragment.setmActivity(MainActivity.this);
        mArrayList.add(mSurgeryFragment);
        mArrayList.add(mEmergencyFragment);
        MyPagerAdapter mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),mArrayList);
        mViewPager.setAdapter(mMyPagerAdapter);
    }


    View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.button_one:
                    mViewPager.setCurrentItem(0);
                    break;
                case R.id.button_two:
                    mViewPager.setCurrentItem(1);
                    break;
                default:
                    break;
            }
        }
    };
}

然后是MainActivity中的两个Fragment代码:
第一个:

package com.zhjy.fragmentdemo.fragment;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.nineoldandroids.view.ViewPropertyAnimator;
import com.zhjy.fragmentdemo.R;
import com.zhjy.fragmentdemo.adapter.MyPagerAdapter;

import java.util.ArrayList;

/**
 * @author :huangxianfeng on 2016/11/2.
 * 蔬菜
 */
public class SurgeryFragment extends Fragment {

    private Activity mActivity;
    private Button mButton1,mButton2,mButton3;
    private ViewPager mViewPager;
    private View mView;
    private int lineWidth;
    private ArrayList<Fragment> mArrayList;
    private AFragment mAFragment;
    private BFragment mBFragment;
    private CFragment mCFragment;
    private MyPagerAdapter mMyPagerAdater;

    public void setmActivity(Activity mActivity) {
        this.mActivity = mActivity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = View.inflate(mActivity, R.layout.fragment_surgery,null);
        init(view);
        setAction();
        return view;
    }

    private void init(View view) {
        mButton1 = (Button)view.findViewById(R.id.button_1);
        mButton2 = (Button)view.findViewById(R.id.button_2);
        mButton3 = (Button)view.findViewById(R.id.button_3);
        mViewPager = (ViewPager)view.findViewById(R.id.fragmen1_viewpager);
        mView = view.findViewById(R.id.indicate_line);

        mButton1.setOnClickListener(mOnClickListener);
        mButton2.setOnClickListener(mOnClickListener);
        mButton3.setOnClickListener(mOnClickListener);
        initCalulateLength();
        if (mArrayList == null){
            mArrayList = new ArrayList<>();
        }
        if (mAFragment == null){
            mAFragment = new AFragment();
        }
        mAFragment.setmActivity(mActivity);
        if (mBFragment == null){
            mBFragment = new BFragment();
        }
        mBFragment.setmActivity(mActivity);
        if (mCFragment == null){
            mCFragment = new CFragment();
        }
        mCFragment.setmActivity(mActivity);
        mArrayList.add(mAFragment);
        mArrayList.add(mBFragment);
        mArrayList.add(mCFragment);
        if (mMyPagerAdater == null){
            mMyPagerAdater = new MyPagerAdapter(getFragmentManager(),mArrayList);
        }
        mViewPager.setAdapter(mMyPagerAdater);
    }


    private void setAction() {
        //设置ViewPager的监听事件
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                int length=(int)(position*lineWidth+positionOffset*lineWidth);
                ViewPropertyAnimator.animate(mView).translationX(length).setDuration(0);
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    //Button的监听事件
    View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.button_1:
                    mViewPager.setCurrentItem(0);
                    break;
                case R.id.button_2:
                    mViewPager.setCurrentItem(1);
                    break;
                case R.id.button_3:
                    mViewPager.setCurrentItem(2);
                    break;
                default:
                    break;
            }
        }
    };

    //测量宽度
    protected  void initCalulateLength(){
        //最后的数字3代表分几块
        lineWidth=mActivity.getWindowManager().getDefaultDisplay().getWidth()/3;
        mView.getLayoutParams().width=lineWidth;
        mView.requestLayout();
    }
}

第二个:

package com.zhjy.fragmentdemo.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.nineoldandroids.view.ViewPropertyAnimator;
import com.zhjy.fragmentdemo.R;
import com.zhjy.fragmentdemo.adapter.MyPagerAdapter;

import java.util.ArrayList;

/**
 * @author :huangxianfeng on 2016/11/2.
 * 水果
 */
public class EmergencyFragment extends Fragment {

    private Activity mActivity;
    private Button mButton1,mButton2,mButton3;
    private ViewPager mViewPager;
    private View mView;
    private int lineWidth;
    private ArrayList<Fragment> mArrayList;
    private AFragment mAFragment;
    private BFragment mBFragment;
    private CFragment mCFragment;
    private MyPagerAdapter mMyPagerAdater;

    public void setmActivity(Activity mActivity) {
        this.mActivity = mActivity;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = View.inflate(mActivity, R.layout.fragment_emergency,null);
        init(view);
        setAction();
        return view;
    }
    private void init(View view) {
        mButton1 = (Button)view.findViewById(R.id.button_1);
        mButton2 = (Button)view.findViewById(R.id.button_2);
        mButton3 = (Button)view.findViewById(R.id.button_3);
        mViewPager = (ViewPager)view.findViewById(R.id.fragmen2_viewpager);
        mView = view.findViewById(R.id.indicate_line);

        mButton1.setOnClickListener(mOnClickListener);
        mButton2.setOnClickListener(mOnClickListener);
        mButton3.setOnClickListener(mOnClickListener);
        initCalulateLength();
        if (mArrayList == null){
            mArrayList = new ArrayList<>();
        }
        if (mAFragment == null){
            mAFragment = new AFragment();
        }
        mAFragment.setmActivity(mActivity);
        if (mBFragment == null){
            mBFragment = new BFragment();
        }
        mBFragment.setmActivity(mActivity);
        if (mCFragment == null){
            mCFragment = new CFragment();
        }
        mCFragment.setmActivity(mActivity);
        mArrayList.add(mAFragment);
        mArrayList.add(mBFragment);
        mArrayList.add(mCFragment);
        if (mMyPagerAdater == null){
            mMyPagerAdater = new MyPagerAdapter(getFragmentManager(),mArrayList);
        }
        mViewPager.setAdapter(mMyPagerAdater);
    }


    private void setAction() {
        //设置ViewPager的监听事件
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                int length=(int)(position*lineWidth+positionOffset*lineWidth);
                ViewPropertyAnimator.animate(mView).translationX(length).setDuration(0);
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    //Button的监听事件
    View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.button_1:
                    mViewPager.setCurrentItem(0);
                    break;
                case R.id.button_2:
                    mViewPager.setCurrentItem(1);
                    break;
                case R.id.button_3:
                    mViewPager.setCurrentItem(2);
                    break;
                default:
                    break;
            }
        }
    };

    //测量宽度
    protected  void initCalulateLength(){
        lineWidth=mActivity.getWindowManager().getDefaultDisplay().getWidth()/3;
        mView.getLayoutParams().width=lineWidth;
        mView.requestLayout();
    }
}

以上两个Fragment有相同的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <Button
            android:text="香蕉"
            android:id="@+id/button_1"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
        <Button
            android:text="苹果"
            android:id="@+id/button_2"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
        <Button
            android:text="葡萄"
            android:id="@+id/button_3"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_centerVertical="true"
            android:background="#f6bd9f" />
        <View
            android:id="@+id/indicate_line"
            android:layout_width="0dp"
            android:layout_height="3.3dp"
            android:background="#F48F5E" />
    </RelativeLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/fragmen2_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

然后这其中的两个Fragment钟分别有三个Fragment使用,此时要注意,在主界面的时候ViewPager要限制他的左右滑动,不然的会在子ViewPager滑到最后一个的时候,会滑动MainActivity中的ViewPager.
限制MainActivity中左右滑动的自定义ViewPager如下:

package com.zhjy.fragmentdemo.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
 * @author :huangxianfeng on 2016/11/2.
 * 自定义ViewPager限制其左右滑动
 */
public class NonSwipeableViewPager extends ViewPager {

    public NonSwipeableViewPager(Context context) {
        super(context);
    }

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }
}

有一些比较简单的布局我就没有贴出来,可以自己随便写点东西。如果有什么好的建议,大家可以留言。


源码下载地址:
http://download.csdn.net/detail/huang3513/9671309


声明

欢迎转载博客,但请保留文章原始出处
作者:定陶黄公子
出处:http://blog.csdn.net/huang3513/article/details/53010147

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DT从零到壹

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值