前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >4-AVI--Fragment与ViewPager结合

4-AVI--Fragment与ViewPager结合

作者头像
张风捷特烈
发布2018-09-29 11:13:06
5900
发布2018-09-29 11:13:06
举报
零、前言

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
代码语言:javascript
复制
/**
 * 作者:张风捷特烈<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
代码语言:javascript
复制
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

代码语言:javascript
复制
/**
 * 作者:张风捷特烈<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方法换成下面
代码语言:javascript
复制
    @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
代码语言:javascript
复制
<?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
代码语言:javascript
复制
<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>

本文由张风捷特烈原创,转载请注明 更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 你的喜欢与支持将是我最大的动力

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言
    • 大致过程
    • 一、代码实现:
      • 1.ViewPagerFragment
        • 2.ViewPagerFragmentActivity
        • 二、Fragment实现懒加载
          • LazyViewPagerFragment:将ViewPagerFragment的onCreateView方法换成下面
          • 附录、布局
            • activity_viewpager
              • fragment_viewpager
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档