零、前言
[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