viewpager懒加载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nongminkouhao/article/details/81712669

viewpager懒加载

什么是懒加载:viewpager会默认预加载当前界面左右的fragment,为了防止其他需要预加载并且不可见的fragment与当前可见的fragment在加载数据时抢占cpu和内存资源,预加载的fragment只有当其可见时才去加载数据,这样有利于提高用户体验

效果图如下:每个界面只有在可见时才会随机一个整数且只随机一次
效果图

涉及到以下几点知识点:

  • 通过setOffscreenPageLimit方法设置offscreenPageLimit个数来控制缓存可见界面左右两边各缓存的page数目 ,总数目为n*2+1;当加载的page超过这个数目时会用FragmentManager来释放fragment;offscreenPageLimit默认值为1
  • FragmentPagerAdapter当缓存的界面超过n*2+1时候,会对界面进行回收,只会回收view,不回收Fragment,见图 执行了Fragment的onDestoryView方法,并没有执行onDestory方法,下次使用时候会重新初始化view;适合fragment数目较少的情况,因为其fragment并没有被回收,一直占用着内存
  • setUserVisibleHint(boolean isVisibleToUser)的参数isVisibleToUser为true时候表示当前fragment对用户可见,为false时表示对用户不可见
  • FragmentStatePagerAdapter当缓存的界面超过n*2+1时候,会对界面进行回收,会把整个Fragment进行回收,见图 执行了Fragment的onDestory方法,下次使用时会重新创建一个fragment;适合fragment数目比较多

Adapter为FragmentPagerAdapter时,日志如下:


FragmentPagerAdapter 
--------------------------------------app启动打开第0个fragment-------------------------------------------------
09-20 22:06:00.468 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 22:06:00.468 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:06:00.468 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 22:06:00.469 5366-5366/com.hj.test D/生命周期_Fragment0: onAttach
09-20 22:06:00.469 5366-5366/com.hj.test D/生命周期_Fragment1: onAttach
09-20 22:06:00.469 5366-5366/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onStart
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onResume
09-20 22:06:00.473 5366-5366/com.hj.test D/生命周期_Fragment1: onCreateView
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onActivityCreated
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onViewStateRestored
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onStart
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onResume

--------------------------------------由第0个fragment滑动到第1个fragment---------------------------------------------------
09-20 22:06:07.455 5366-5366/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 22:06:07.455 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 22:06:07.455 5366-5366/com.hj.test D/生命周期_Fragment1: lazyLoad第1个界面准备加载数据
09-20 22:06:07.458 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 22:06:07.459 5366-5366/com.hj.test D/生命周期_Fragment2: onAttach
09-20 22:06:07.460 5366-5366/com.hj.test D/生命周期_Fragment2: onCreateView
09-20 22:06:07.469 5366-5366/com.hj.test D/生命周期_Fragment2: onActivityCreated
09-20 22:06:07.469 5366-5366/com.hj.test D/生命周期_Fragment2: onViewStateRestored
09-20 22:06:07.469 5366-5366/com.hj.test D/生命周期_Fragment2: onStart
09-20 22:06:07.470 5366-5366/com.hj.test D/生命周期_Fragment2: onResume

--------------------------------------由第1个fragment滑动到第2个fragment---------------------------------------------------
09-20 22:06:21.633 5366-5366/com.hj.test D/生命周期_Fragment3: setUserVisibleHintfalse
09-20 22:06:21.634 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:06:21.634 5366-5366/com.hj.test D/生命周期_Fragment2: lazyLoad第2个界面准备加载数据
09-20 22:06:21.637 5366-5366/com.hj.test D/生命周期_Fragment2: setUserVisibleHinttrue
09-20 22:06:21.638 5366-5366/com.hj.test D/生命周期_Fragment3: onAttach
09-20 22:06:21.639 5366-5366/com.hj.test D/生命周期_Fragment0: onPause
09-20 22:06:21.639 5366-5366/com.hj.test D/生命周期_Fragment0: onStop
09-20 22:06:21.640 5366-5366/com.hj.test D/生命周期_Fragment0: onDestroyView
09-20 22:06:21.642 5366-5366/com.hj.test D/生命周期_Fragment3: onCreateView
09-20 22:06:21.653 5366-5366/com.hj.test D/生命周期_Fragment3: onActivityCreated
09-20 22:06:21.654 5366-5366/com.hj.test D/生命周期_Fragment3: onViewStateRestored
09-20 22:06:21.654 5366-5366/com.hj.test D/生命周期_Fragment3: onStart
09-20 22:06:21.654 5366-5366/com.hj.test D/生命周期_Fragment3: onResume

--------------------------------------由第2个fragment滑动到第1个fragment---------------------------------------------------
09-20 22:06:29.427 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 22:06:29.428 5366-5366/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 22:06:29.428 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 22:06:29.430 5366-5366/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 22:06:29.440 5366-5366/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 22:06:29.440 5366-5366/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 22:06:29.441 5366-5366/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 22:06:29.442 5366-5366/com.hj.test D/生命周期_Fragment3: onPause
09-20 22:06:29.442 5366-5366/com.hj.test D/生命周期_Fragment3: onStop
09-20 22:06:29.442 5366-5366/com.hj.test D/生命周期_Fragment3: onDestroyView
09-20 22:06:29.443 5366-5366/com.hj.test D/生命周期_Fragment0: onStart
09-20 22:06:29.443 5366-5366/com.hj.test D/生命周期_Fragment0: onResume

--------------------------------------由第1个fragment滑动到第0个fragment---------------------------------------------------
09-20 22:06:37.288 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:06:37.288 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 22:06:37.291 5366-5366/com.hj.test D/生命周期_Fragment2: onPause
09-20 22:06:37.291 5366-5366/com.hj.test D/生命周期_Fragment2: onStop
09-20 22:06:37.291 5366-5366/com.hj.test D/生命周期_Fragment2: onDestroyView
                                                           


Adapter为FragmentStatePagerAdapter时,日志如下:

FragmentStatePagerAdapter 
--------------------------------------app启动打开第0个fragment-------------------------------------------------
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment0: onAttach
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment1: onAttach
09-20 21:44:18.282 8635-8635/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 21:44:18.285 8635-8635/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onStart
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onResume
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment1: onCreateView
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onActivityCreated
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onViewStateRestored
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onStart
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onResume

--------------------------------------由第0个fragment滑动到第1个fragment---------------------------------------------------

09-20 21:45:11.405 8635-8635/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 21:45:11.406 8635-8635/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 21:45:11.406 8635-8635/com.hj.test D/生命周期_Fragment1: lazyLoad第1个界面准备加载数据
09-20 21:45:11.409 8635-8635/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 21:45:11.411 8635-8635/com.hj.test D/生命周期_Fragment2: onAttach
09-20 21:45:11.413 8635-8635/com.hj.test D/生命周期_Fragment2: onCreateView
09-20 21:45:11.427 8635-8635/com.hj.test D/生命周期_Fragment2: onActivityCreated
09-20 21:45:11.428 8635-8635/com.hj.test D/生命周期_Fragment2: onViewStateRestored
09-20 21:45:11.428 8635-8635/com.hj.test D/生命周期_Fragment2: onStart
09-20 21:45:11.428 8635-8635/com.hj.test D/生命周期_Fragment2: onResume

--------------------------------------由第1个fragment滑动到第2个fragment---------------------------------------------------
09-20 21:45:50.422 8635-8635/com.hj.test D/生命周期_Fragment0: onSaveInstanceState
09-20 21:45:50.426 8635-8635/com.hj.test D/生命周期_Fragment3: setUserVisibleHintfalse
09-20 21:45:50.427 8635-8635/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 21:45:50.427 8635-8635/com.hj.test D/生命周期_Fragment2: lazyLoad第2个界面准备加载数据
09-20 21:45:50.431 8635-8635/com.hj.test D/生命周期_Fragment2: setUserVisibleHinttrue
09-20 21:45:50.432 8635-8635/com.hj.test D/生命周期_Fragment3: onAttach
09-20 21:45:50.433 8635-8635/com.hj.test D/生命周期_Fragment0: onPause
09-20 21:45:50.434 8635-8635/com.hj.test D/生命周期_Fragment0: onStop
09-20 21:45:50.434 8635-8635/com.hj.test D/生命周期_Fragment0: onDestroyView
09-20 21:45:50.436 8635-8635/com.hj.test D/生命周期_Fragment0: onDestroy
09-20 21:45:50.436 8635-8635/com.hj.test D/生命周期_Fragment0: onDetach
09-20 21:45:50.438 8635-8635/com.hj.test D/生命周期_Fragment3: onCreateView
09-20 21:45:50.450 8635-8635/com.hj.test D/生命周期_Fragment3: onActivityCreated
09-20 21:45:50.451 8635-8635/com.hj.test D/生命周期_Fragment3: onViewStateRestored
09-20 21:45:50.451 8635-8635/com.hj.test D/生命周期_Fragment3: onStart
09-20 21:45:50.451 8635-8635/com.hj.test D/生命周期_Fragment3: onResume

--------------------------------------由第2个fragment滑动到第1个fragment---------------------------------------------------
09-20 21:59:12.714 27188-27188/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 21:59:12.715 27188-27188/com.hj.test D/生命周期_Fragment3: onSaveInstanceState
09-20 21:59:12.717 27188-27188/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 21:59:12.718 27188-27188/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 21:59:12.719 27188-27188/com.hj.test D/生命周期_Fragment0: onAttach
09-20 21:59:12.720 27188-27188/com.hj.test D/生命周期_Fragment3: onPause
09-20 21:59:12.720 27188-27188/com.hj.test D/生命周期_Fragment3: onStop
09-20 21:59:12.720 27188-27188/com.hj.test D/生命周期_Fragment3: onDestroyView
09-20 21:59:12.722 27188-27188/com.hj.test D/生命周期_Fragment3: onDestroy
09-20 21:59:12.723 27188-27188/com.hj.test D/生命周期_Fragment3: onDetach
09-20 21:59:12.723 27188-27188/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 21:59:12.737 27188-27188/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 21:59:12.737 27188-27188/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 21:59:12.739 27188-27188/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 21:59:12.739 27188-27188/com.hj.test D/生命周期_Fragment0: onStart
09-20 21:59:12.739 27188-27188/com.hj.test D/生命周期_Fragment0: onResume

--------------------------------------由第1个fragment滑动到第0个fragment---------------------------------------------------
09-20 22:00:30.527 27188-27188/com.hj.test D/生命周期_Fragment2: onSaveInstanceState
09-20 22:00:30.528 27188-27188/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:00:30.528 27188-27188/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 22:00:30.530 27188-27188/com.hj.test D/生命周期_Fragment2: onPause
09-20 22:00:30.531 27188-27188/com.hj.test D/生命周期_Fragment2: onStop
09-20 22:00:30.531 27188-27188/com.hj.test D/生命周期_Fragment2: onDestroyView
09-20 22:00:30.533 27188-27188/com.hj.test D/生命周期_Fragment2: onDestroy
09-20 22:00:30.533 27188-27188/com.hj.test D/生命周期_Fragment2: onDetach

offscreenPageLimit为默认值1,默认加载当前界面左右各一个;左边没有,所以进入界面会加载第0个位置和预加载第1个位置的fragment;首先界面显示前,两个fragment的setUserVisibleHint都为false,不可见,然后对第0、1个位置进行初始化操作;当第0个位置的fragment的onAttach、onCreate执行后,会发现setUserVisibleHint为true了,我们会在这时候做一些数据加载的操作

LazyFragment代码如下:

package com.hj.test;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;

public abstract class LazyFragment extends Fragment {

    protected FragmentActivity mActivity;

    protected boolean isVisibleToUser;//当前界面是否可见
    protected boolean isViewInitialized;//view是否初始化完成
    protected boolean isDataInitialized;//数据是否加载过

    protected Bundle bundle;

    public abstract void setUpView(View view);
    public abstract void setUpData();

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        bundle = getArguments();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = getActivity();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        setUpView(view);
        isViewInitialized = true;
        if (savedInstanceState != null){
            onRestoreInstanceState(savedInstanceState);
        }
        if (isDataInitialized){
            setUpData();
        }else {
            checkIsLoadData();//因为刚进来有setUserVisibleHint先执行,当前可见,但是view还没有初始化的情况,所以在view初始化完毕还需要重新判断是否需要懒加载数据
        }

    }

    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        isDataInitialized = true;
    }


    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        checkIsLoadData();
        Log.d("生命周期_Fragment"+getArguments().get("id"),"setUserVisibleHint"+isVisibleToUser);
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d("生命周期_Fragment"+bundle.get("id"),"onActivityCreated");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isViewInitialized = false;
        Log.d("生命周期_Fragment"+bundle.get("id"),"onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("生命周期_Fragment"+bundle.get("id"),"onDetach");
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("生命周期_Fragment"+bundle.get("id"),"onSaveInstanceState");
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        Log.d("生命周期_Fragment"+bundle.get("id"),"onViewStateRestored");
    }

    /**
     * 检查是否需要加载数据
     */
    private void checkIsLoadData(){
        if(isVisibleToUser && isViewInitialized && !isDataInitialized){//当前可见&&view已经初始化&&数据没有初始化
            isDataInitialized = true;
            setUpData();
        }
    }

}

SimpleFragment代码如下:

package com.hj.test;


import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.Random;

public class SimpleFragment extends LazyFragment {

    private TextView tv;
    private String data;

    @Override
    public void setUpView(View view) {
        tv = (TextView) view.findViewById(R.id.tv);
    }

    @Override
    public void setUpData() {
        Log.d("生命周期_Fragment"+bundle.get("id"),"lazyLoad第"+bundle.get("id")+"个界面准备加载数据");
        if(TextUtils.isEmpty(data)){
            data = new Random().nextInt(10)+"";
        }

        tv.setText(data);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d("生命周期_Fragment"+bundle.get("id"),"onCreateView");
        return inflater.inflate(R.layout.fragment_layout, null);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if(!TextUtils.isEmpty(tv.getText())){
            outState.putString("data",tv.getText().toString());
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState != null) {
            data = savedInstanceState.getString("data");
        }
    }
}

MainActivity代码如下:

package com.hj.test;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;

import com.flyco.tablayout.SlidingTabLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private final String[] mTitles = {"第0个", "第1个", "第2个", "第3个", "第4个"};
    private ViewPager viewpager;
    private MyAdapter adapter;
    private SlidingTabLayout slidingtablayout;
    private List<Fragment> fragments = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewpager = (ViewPager) findViewById(R.id.exam_viewpager);
        addFragments();

        adapter = new MyAdapter(getSupportFragmentManager(), fragments);
        viewpager.setAdapter(adapter);

        slidingtablayout = (SlidingTabLayout) findViewById(R.id.examtablayout);
        slidingtablayout.setViewPager(viewpager);
    }

    private void addFragments() {
        for (int i=0;i<5;i++){
            fragments.add(new SimpleFragment());
        }
    }

    class MyAdapter extends FragmentPagerAdapter {

        private List<Fragment> fragmentList;

        public MyAdapter(FragmentManager fm, List<Fragment> fragmentList) {
            super(fm);
            this.fragmentList = fragmentList;
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = fragmentList.get(position);
            Bundle bundle = new Bundle();
            bundle.putInt("id",position);
            fragment.setArguments(bundle);
            return fragmentList.get(position);
        }

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

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

    }
}

activity_main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tl="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hj.test.MainActivity">

    <com.flyco.tablayout.SlidingTabLayout
        android:id="@+id/examtablayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        tl:tl_divider_width="0dp"
        tl:tl_indicator_color="@android:color/holo_blue_light"
        tl:tl_indicator_height="2dp"
        tl:tl_tab_padding="20dp"
        tl:tl_tab_space_equal="true"
        tl:tl_textSelectColor="@android:color/background_dark"
        tl:tl_textUnselectColor="@android:color/holo_red_light"
        tl:tl_underline_color="@android:color/holo_blue_dark"
        tl:tl_underline_height="1dp"
        >
    </com.flyco.tablayout.SlidingTabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/exam_viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/examtablayout"/>

</LinearLayout>

fragment_layout.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hj.test.MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="fragment"/>

</LinearLayout>

有问题请留言指出,谢谢

猜你喜欢

转载自blog.csdn.net/nongminkouhao/article/details/81712669