• 4-AVI--Fragment与ViewPager结合


    零、前言

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

    大致过程

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

    9414344-490e172f91ae66d8.gif
    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:实现借鉴了这篇文章

    9414344-23f74dde516967b4.gif
    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.欢迎关注我的微信公众号,最新精彩文章,及时送达:
    9414344-c474349cd3bd4b82.jpg
    公众号.jpg
  • 相关阅读:
    第一次作业
    C语言I博客作业04
    C语言I博客作业05
    c语言l博客作业02
    C语言I博客作业06
    linux下递归删除目录下所有exe文件
    CSS高级
    CSS样式
    CSS框模型
    Oracle的用户、角色和权限
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781920.html
Copyright © 2020-2023  润新知