Android解决ViewPager嵌套ViewPager中多层Fragment子ViewPager中加载不出来Fragment


最近UI重新设计了一个店铺首页的效果,要用到ViewPager嵌套ViewPager才能实现效果,可是在子ViewPager中出现了加载不出来Fragment,由于里面用了多层的Fragment。

老规矩,先看效果图,没图说个j8。
Android解决ViewPager嵌套ViewPager中多层Fragment子ViewPager中加载不出来Fragment

先看代码:

首页代码:
Android解决ViewPager嵌套ViewPager中多层Fragment子ViewPager中加载不出来Fragment
第一层布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="-4dp"
    android:background="@drawable/ic_shop_bg2"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="28dp"
        android:layout_marginLeft="@dimen/text_layout_15_dp"
        android:layout_marginRight="@dimen/text_layout_15_dp"
        android:layout_marginTop="25dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_shop_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="ShopName"
            android:textColor="@color/white"
            android:textSize="@dimen/text_size_16sp"
            android:textStyle="bold" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="right"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <Button
                android:id="@+id/bt_shop_is_coll"
                android:layout_width="61dp"
                android:layout_height="28dp"
                android:layout_marginRight="@dimen/text_layout_12_dp"
                android:background="@drawable/ic_shop_text_bg"
                android:text="已关注"
                android:textColor="@color/white"
                android:textSize="@dimen/text_size_13_sp" />

            <LinearLayout
                android:layout_width="75dp"
                android:layout_height="28dp"
                android:background="@drawable/ic_shop_text_bg"
                android:gravity="center"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/tv_shop_other"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:gravity="center_vertical"
                    android:paddingLeft="@dimen/text_layout_5_dp"
                    android:paddingRight="@dimen/text_layout_10_dp"
                    android:text="···"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_size_20_sp" />

                <View
                    android:layout_width="1dp"
                    android:layout_height="match_parent"
                    android:layout_marginBottom="@dimen/text_layout_5_dp"
                    android:layout_marginTop="@dimen/text_layout_5_dp"
                    android:background="@color/white"
                    android:gravity="center_vertical" />

                <ImageView
                    android:id="@+id/iv_shop_exit"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:gravity="center_vertical"
                    android:paddingLeft="@dimen/text_layout_10_dp"
                    android:paddingRight="@dimen/text_layout_5_dp"
                    android:src="@drawable/ic_shop_exit"
                    android:textSize="@dimen/text_size_15_sp" />
            </LinearLayout>
        </LinearLayout>

    </LinearLayout>

    <com.jkgl.view.NoSlideViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_marginTop="@dimen/text_layout_5_dp"
        />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/text_layout_50_dp"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:background="@color/white"
        android:paddingLeft="@dimen/text_layout_15_dp"
        android:paddingRight="@dimen/text_layout_15_dp"
        >
        <RelativeLayout
            android:id="@+id/rl_shop_home"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:gravity="center"
            >
            <ImageView
                android:id="@+id/iv_shop_logo"
                android:layout_width="41dp"
                android:layout_height="41dp"
                android:src="@drawable/logo1"
                android:visibility="visible"
                />
            <TextView
                android:id="@+id/tv_shop_home"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="首页"
                android:textColor="@color/tv333"
                android:textSize="@dimen/text_size_10_sp"
                android:drawableTop="@drawable/ic_shop_home"
                android:drawablePadding="@dimen/text_layout_5_dp"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:visibility="gone"
                />
        </RelativeLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical"
            >
            <TextView
                android:id="@+id/tv_all_goods"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="全部宝贝"
                android:textColor="@color/tv333"
                android:textSize="@dimen/text_size_10_sp"
                android:drawableTop="@drawable/ic_shop_all"
                android:drawablePadding="@dimen/text_layout_5_dp"
                />
        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical"
            >
            <TextView
                android:id="@+id/tv_shop_goods_classify"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="宝贝分类"
                android:textColor="@color/tv333"
                android:textSize="@dimen/text_size_10_sp"
                android:drawableTop="@drawable/ic_shop_classify"
                android:drawablePadding="@dimen/text_layout_5_dp"
                />
        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical"
            >
            <TextView
                android:id="@+id/tv_shop_service"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="联系客服"
                android:textColor="@color/tv333"
                android:textSize="@dimen/text_size_10_sp"
                android:drawableTop="@drawable/ic_shop_service"
                android:drawablePadding="@dimen/text_layout_5_dp"
                />
        </LinearLayout>

    </LinearLayout>
</LinearLayout>

第一层逻辑代码

/**
 * 店铺首页
 */

public class ShopActivity extends FastBaseActivity {

    @InjectView(R.id.tv_shop_name)
    TextView tv_shop_name;
    @InjectView(R.id.tv_shop_other)
    TextView tv_shop_other;//三个点
    @InjectView(R.id.bt_shop_is_coll)
    Button bt_shop_is_coll;//是否关注
    @InjectView(R.id.iv_shop_exit)
    ImageView iv_shop_exit;//退出
    @InjectView(R.id.viewPager)
    NoSlideViewPager viewPager;

    @InjectView(R.id.rl_shop_home)
    RelativeLayout rl_shop_home;
    @InjectView(R.id.iv_shop_logo)
    ImageView iv_shop_logo;
    @InjectView(R.id.tv_shop_home)
    TextView tv_shop_home;
    @InjectView(R.id.tv_all_goods)
    TextView tv_all_goods;
    @InjectView(R.id.tv_shop_goods_classify)
    TextView tv_shop_goods_classify;
    @InjectView(R.id.tv_shop_service)
    TextView tv_shop_service;


    private List<Fragment> fragmentList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shop);
        ButterKnife.inject(this);
        initView();
    }

    private void initView() {
        fragmentList = new ArrayList<>();
        fragmentList.add(ShopHomeFragment.getInstance());
        fragmentList.add(AllGoodsFragment.getInstance());
        fragmentList.add(GoodsClassifyFragment.getInstance());
        MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        viewPager.setOffscreenPageLimit(3);
    }

    @OnClick({R.id.iv_shop_exit,R.id.rl_shop_home,R.id.tv_all_goods,R.id.tv_shop_goods_classify,R.id.tv_shop_service})
    public void onClick(View view) {
        Drawable drawableTopAllNormal = getResources().getDrawable(R.drawable.ic_shop_all);
        Drawable drawableTopAllSelect = getResources().getDrawable(R.drawable.ic_shop_all_select);
        Drawable drawableTopClassifyNormal = getResources().getDrawable(R.drawable.ic_shop_classify);
        Drawable drawableTopClassifySelect = getResources().getDrawable(R.drawable.ic_shop_classify_select);
        switch (view.getId()) {
            case R.id.iv_shop_exit:
                finish();
                break;
            case R.id.rl_shop_home:
                iv_shop_logo.setVisibility(View.VISIBLE);
                tv_shop_home.setVisibility(View.GONE);
                tv_all_goods.setTextColor(getResources().getColor(R.color.tv333));
                tv_shop_goods_classify.setTextColor(getResources().getColor(R.color.tv333));
                tv_all_goods.setCompoundDrawablesWithIntrinsicBounds(null,drawableTopAllNormal,null,null);
                tv_shop_goods_classify.setCompoundDrawablesWithIntrinsicBounds(null,drawableTopClassifyNormal,null,null);
                viewPager.setCurrentItem(0,false);
                break;
            case R.id.tv_all_goods:
                tv_all_goods.setCompoundDrawablesWithIntrinsicBounds(null,drawableTopAllSelect,null,null);
                tv_shop_goods_classify.setCompoundDrawablesWithIntrinsicBounds(null,drawableTopClassifyNormal,null,null);
                tv_all_goods.setTextColor(getResources().getColor(R.color.zhutihuang));
                tv_shop_goods_classify.setTextColor(getResources().getColor(R.color.tv333));
                iv_shop_logo.setVisibility(View.GONE);
                tv_shop_home.setVisibility(View.VISIBLE);
                viewPager.setCurrentItem(1,false);
                break;
            case R.id.tv_shop_goods_classify:
                tv_all_goods.setCompoundDrawablesWithIntrinsicBounds(null,drawableTopAllNormal,null,null);
                tv_shop_goods_classify.setCompoundDrawablesWithIntrinsicBounds(null,drawableTopClassifySelect,null,null);
                tv_all_goods.setTextColor(getResources().getColor(R.color.tv333));
                tv_shop_goods_classify.setTextColor(getResources().getColor(R.color.zhutihuang));
                iv_shop_logo.setVisibility(View.GONE);
                tv_shop_home.setVisibility(View.VISIBLE);
                viewPager.setCurrentItem(2,false);
                break;
            case R.id.tv_shop_service:
                String kefu2 = "KEFU154277063782440";
                /**
                 * 启动客户服聊天界面。
                 *
                 * @param context           应用上下文。
                 * @param customerServiceId 要与之聊天的客服 Id。
                 * @param title             聊天的标题,如果传入空值,则默认显示与之聊天的客服名称。
                 * @param customServiceInfo 当前使用客服者的用户信息。{@link CSCustomServiceInfo}
                 */
                RongIM.getInstance().startCustomerServiceChat(this, kefu2, "在线客服",null);
                break;
        }
    }

    private class MyPagerAdapter extends FragmentPagerAdapter{

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

        @Override
        public int getCount() {
            return fragmentList.size();
        }

    }

}

我第一层的viewpager为了防止子View中的滑动冲突,做了一个处理,禁止滑动ViewPager

/**
 * 禁止左右滑动viewpager
 * Created by Administrator on 2018/12/10.
 */

public class NoSlideViewPager extends ViewPager {
    //是否可以进行滑动
    private boolean isSlide = false;

    public void setSlide(boolean slide) {
        isSlide = slide;
    }

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

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return isSlide;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return false;
    }
}

第二层布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_vertical"
            android:layout_gravity="bottom"
            android:layout_marginLeft="@dimen/text_layout_15_dp"
            android:layout_marginRight="@dimen/text_layout_15_dp"
            android:layout_marginTop="@dimen/text_layout_20_dp"
            >
            <LinearLayout
                android:id="@+id/ll_shop_search"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_shop_search_bg"
                android:orientation="horizontal"
                android:gravity="center"
                >
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_shop_search"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="搜索"
                    android:textSize="@dimen/text_size_14_sp"
                    android:textColor="@color/white"
                    />
            </LinearLayout>

            <android.support.design.widget.TabLayout
                android:id="@+id/tab_shop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:tabIndicatorColor="@color/white"
                app:tabSelectedTextColor="@color/white"
                app:tabMode="fixed"
                app:tabTextColor="@color/white"
                style="@style/tabSize"
                android:layout_marginLeft="24dp"
                android:paddingBottom="@dimen/text_layout_5_dp"
                />
        </LinearLayout>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="@dimen/text_layout_5_dp"
        >

    </android.support.v4.view.ViewPager>


</LinearLayout>

代码

/**
 * 店铺首页
 * Created by Administrator on 2018/12/13.
 */

public class ShopHomeFragment extends Fragment {

    LinearLayout ll_shop_search;//搜索
    TabLayout tab_shop;
    ViewPager viewPager;

    private String[] title = {"首页","宝贝","新品"};
    private List<Fragment> fragmentList;

    static ShopHomeFragment fragment;
    public static ShopHomeFragment getInstance(){
        if(fragment == null){
            fragment = new ShopHomeFragment();
        }
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_shop_home,null);
        initView(view);
        initListener();
        return view;
    }

    private void initListener() {
        ll_shop_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToastUtil.showToast("搜索");
            }
        });
    }


    private void initView(View view) {
        ll_shop_search = view.findViewById(R.id.ll_shop_search);
        tab_shop = view.findViewById(R.id.tab_shop);
        viewPager = view.findViewById(R.id.viewPager);


        fragmentList = new ArrayList<>();
        fragmentList.add(new ShopHomeAllFragment());
        fragmentList.add(new ShopHomeGoodsFragment());
        fragmentList.add(new ShopHomeNewGoodsFragment());
        MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager());
        viewPager.setAdapter(adapter);
        tab_shop.setupWithViewPager(viewPager);
        viewPager.setOffscreenPageLimit(3);
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

        @Override
        public int getCount() {
            return fragmentList.size();
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return title[position];
        }
    }
}

这一步处理最重要的是MyPagerAdapter构造方法中不能传入getActivity().getSupportFragmentManager()

MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager());

原因如下:

Activity的Fragment要使用FragmentManager(),
而在Fragment中动态的添加Fragment要使用getChildFragmetManager()来管理。