4-AVI--Fragment与ViewPager结合

简介: 零、前言[1].认真看下图Fragment在ViewPager里的默认生命周期(可在浏览器中单独打开网页查看动图,清晰很多)[2].名字数据随机获取见:随机数据生成 [3].

零、前言

[1].认真看下图Fragment在ViewPager里的默认生命周期(可在浏览器中单独打开网页查看动图,清晰很多)
[2].名字数据随机获取见:随机数据生成
[3].ViewPager的默认加载模式见: ViewPager的基本使用
[4].Fragment实现懒加载,ViewPager的实现见: ViewPager的基本使用

大致过程

打开:创建0,1页
左滑:创建2,1被暂停
再左滑:创建3,2被暂停,并销毁0的视图!注意:Fragement并没有销毁
点击返回键时所有创建的Fragement销毁

fragment在Viewpager中的生命周期.gif

一、代码实现:

1.ViewPagerFragment
/**
 * 作者:张风捷特烈<br/>
 * 时间:2018/8/29 0029:11:25<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:ViewPager和Fragment集合测试的Fragment
 */
public class ViewPagerFragment extends Fragment {
    private static final String TAG = "ViewPagerFragment";
    private String mName;

    /**
     *
     * @param bundle Activity向Fragment的数据
     * @return ViewPagerFragment对象
     */
    public static ViewPagerFragment newInstance(Bundle bundle) {
        //新建ViewPagerFragment对象
        ViewPagerFragment instance = new ViewPagerFragment();
        //设置参数并返回出ViewPagerFragment对象
        instance.setArguments(bundle);
        return instance;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_viewpager, null);
        view.setBackgroundColor(ColUtils.randomRGB());
        TextView tv = view.findViewById(R.id.tv_vp_fg_name);

        mName = getArguments().getString(Cons.EXTRA_CONTENT);
        tv.setText(mName);

        Log.e(TAG, "onCreateView: " + mName);

        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: " + mName);
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.e(TAG, "onPause: " + mName);
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.e(TAG, "onStop: " + mName);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.e(TAG, "onDestroyView: " + mName);
    }
    

    @Override
    public void onDetach() {
        super.onDetach();
        Log.e(TAG, "onDetach: " + mName);
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy: " + mName);
        super.onDestroy();
    }
    
}
2.ViewPagerFragmentActivity
public class ViewPagerFragmentActivity extends FragmentActivity {

    @BindView(R.id.id_vp)
    ViewPager mIdVp;
    private ArrayList<Fragment> mFragments;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewpager);
        ButterKnife.bind(this);

        ArrayList<String> names = DataUtils.getRandomName(5, true);

        mFragments = new ArrayList<>();

        for (String name : names) {
            //新建Bundle对象
            Bundle arguments = new Bundle();
            //以键值对的方式放入Bundle对象中
            arguments.putString(Cons.EXTRA_CONTENT, name);
            //创建ViewPagerFragment并加入mFragments集合中
            mFragments.add(ViewPagerFragment.newInstance(arguments));
        }

        //设置适配器:这里用匿名内部类,你也可以单独抽出(就两个方法,也没太大必要)
        mIdVp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return mFragments.get(position);
            }

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

二、Fragment实现懒加载

很多时候不想让他预创建下一个Fragment:实现借鉴了这篇文章

fragment懒加载.gif
/**
 * 作者:张风捷特烈<br/>
 * 时间:2018/8/29 0029:12:54<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:懒加载Fragment
 */
public abstract class LazyFragment extends Fragment {
    /**
     * 视图是否初始化
     */
    protected boolean initOK = false;
    protected boolean isLoad = false;
    private View mRootView;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        //加载布局
        mRootView = inflater.inflate(setLayoutId(), container, false);

        initOK = true;
        isCanLoadData();//初始化的时候去加载数据
        return mRootView;
    }

    /**
     * 视图是否已经对用户可见,系统的方法
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
    }

    /**
     * 是否可以加载数据
     * 可以加载数据的条件:
     * 1.视图已经初始化
     * 2.视图对用户可见
     */
    private void isCanLoadData() {
        if (!initOK) {//未加载
            return;
        }
        if (getUserVisibleHint()) {
            lazyLoad(mRootView);
            isLoad = true;
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }

    /**
     * 视图销毁的时候讲Fragment是否初始化的状态变为false
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        initOK = false;
        isLoad = false;

    }

    /**
     * 设置Fragment要显示的布局
     *
     * @return 布局的layoutId
     */
    protected abstract int setLayoutId();
    
    
    /**
     * 找出对应的控件
     *
     * @param id 控件id
     * @param <T> 控件类型
     * @return 控件
     */
    protected <T extends View> T findViewById(int id) {

        return (T) mRootView.findViewById(id);
    }

    /**
     * 当视图初始化并且对用户可见的时候去真正的加载数据
     */
    protected abstract void lazyLoad(View view);

    /**
     * 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
     */
    protected void stopLoad() {
    }
}
LazyViewPagerFragment:将ViewPagerFragment的onCreateView方法换成下面
    @Override
    protected void lazyLoad(View view) {
        view.setBackgroundColor(ColUtils.randomRGB());
        TextView tv = findViewById(R.id.tv_vp_fg_name);
        mName = getArguments().getString(Cons.EXTRA_CONTENT);
        tv.setText(mName);
        Log.e(TAG, "onCreateView: " + mName);
    }

    @Override
    protected int setLayoutId() {
        return R.layout.fragment_viewpager;
    }

附录、布局

activity_viewpager
<?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=".activity.ActFragmentActivity">

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

fragment_viewpager
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

    <TextView
        android:id="@+id/tv_vp_fg_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textColor="#fff"
        android:textSize="50sp"/>
</RelativeLayout>


后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg
相关文章
|
11月前
|
XML Java 数据格式
ViewPager和Fragment使用(附源码)
1 初级版 ViewPager通过滑动来切换Fragment,无底部导航栏。 用法:数据List<Fragment>+适配器FragmentPagerAdapter+ViewPager 通过FragmentPagerAdapter连接两者的桥梁,里面需要重写两个方法getItem,getCount。 第一个方法是获取一个Fragment,从数据源获取。 第二个方法是获取数据源的大小,也就是有几页。
105 0
|
安全
Fragment里面有ViewPager,ViewPager里面又嵌套Fragment,刚遇到的一个坑
Fragment里面有ViewPager,ViewPager里面又嵌套Fragment,刚遇到的一个坑
|
Android开发
Android笔记:ViewPager和TabLayout连用时,去除ViewPager预加载
Android笔记:ViewPager和TabLayout连用时,去除ViewPager预加载
172 0
fragment嵌套viewpager不显示
fragment嵌套viewpager不显示
160 0
|
Android开发
Android笔记:viewPager+fragment实现循环滚动
Android笔记:viewPager+fragment实现循环滚动
166 0
|
Android开发
Android ViewPager嵌套Fragment出现白页面
解决ViewPager嵌套Fragment页面白屏 viewPager.setOffscreenPageLimit(Fragment的数量);
1536 0