您现在的位置是:首页 > 文章详情

4-AVI--Fragment与ViewPager结合

日期:2018-08-28点击:287

零、前言

[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
原文链接:https://yq.aliyun.com/articles/633822
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章