4-AVI--Fragment与ViewPager结合
零、前言
[1].认真看下图Fragment在ViewPager里的默认生命周期(可在浏览器中单独打开网页查看动图,清晰很多)
[2].名字数据随机获取见:随机数据生成
[3].ViewPager的默认加载模式见: ViewPager的基本使用
[4].Fragment实现懒加载,ViewPager的实现见: ViewPager的基本使用
大致过程
打开:创建0,1页
左滑:创建2,1被暂停
再左滑:创建3,2被暂停,并销毁0的视图!注意:Fragement并没有销毁
点击返回键时所有创建的Fragement销毁
一、代码实现:
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:实现借鉴了这篇文章
/** * 作者:张风捷特烈<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.欢迎关注我的微信公众号,最新精彩文章,及时送达:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
新手必看!iOS 和 Android的 APP 设计有什么差异?
了解并适当结合平台规范与优势,才能做到最佳的用户体验。在《最新Android & iOS设计尺寸规范》一文中介绍APP 设计规范(https://ds.mockplus.cn),同时本文也是一些补充。 为了创建最佳的原生APP,就需要你牢记iOS和Android平台之间的差异。这些平台差异不仅在视觉层面有所不同,在结构和流程上也有区别。牢记这些差异,才能给原生 应用以最佳的用户体验。 本文将聚焦于iOS和Android上的交互设计模式之间的区别,阐明iOS和Android上的应用看起来不同的原因,以及它们为什么应该这样做。 另外,本文还将提供原生应用设计示例,以帮助你更好的理解本文所写的内容。 导航模式的差异 在界面之间切换是移动应用中的常见操作。考虑ios和Android原生应用控件规范的差异,对于导航模式的设计很关键。 Android设备底部有一个全局导航栏, 使用导航栏中的后退按钮是返回上一个界面或步骤的简便方法,它适用于所有Android应用。 全局导航栏(Android) 对比Apple,设计方法却截然不同。 iOS没有全局导航栏,因此我们不能指望像Android原生...
- 下一篇
Android 6.0 权限行为变更详解
版权声明:本文为sydMobile原创文章,转载请务必注明出处! https://blog.csdn.net/sydMobile/article/details/82182615 文章最早发布于我的微信公众号 Android开发者家园 中,欢迎大家扫描下面二维码关注微信公众获取更多知识内容。 本文为sydMobile原创文章,可以随意转载,但请务必注明出处! Android 6.0 权限行为变更 运行时权限说明 Android 6.0 引入了一种新的权限模式,使得用户可以在运行 APP 的时候对一些比较敏感的权限进行管理。这种新的模式可以让用户更好的了解和控制权限,同时为应用精简了安装和自动更新过程。 对于以 Android 6.0 或者更高版本为目标平台的应用,务必在运行的时候检查和请求权限(针对一些危险权限)否则,如果直接调用相关需要特殊权限的方法的话,会导致 APP 的崩溃。检查是否已经拥有权限了可以使用方法 checkSelfPerssion() 如果要请求权限使用方法 requestPermissions 方法。这两个方法都是在 API 23 后引入的,也就是说在之前的 AP...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16