4-AVI--Fragment与ViewPager结合

mac2022-06-30  94

零、前言

[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://www.cnblogs.com/toly-top/p/9781920.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)