一、Fragment的生命周期
Fragment与Activity
Fragment生命周期与Activity息息相关,Activity通过FragmentManager管理Fragment生命周期,FragmentTransaction
FragmentTransaction中的add,remove、replace、attach、detach、hide、show等方法对Fragment进行操作,使Fragment的状态发生变化
二、Fragment与Fragment之间的通信方式和Fragment与Activity通讯的方式
1、通过getFragmentManager:
getFragmentManager().findFragmentById(R.id.fragment); //获取到对应Fragment的引用
2、通过接口
使Activity继承自某个接口,传递给Fragment然后用于回调即可实现与Activity和Fragment之间的通信。
3、通过广播
既可实现与fragment之间的通信也可以实现与Activity之间的通信。
4、直接Fragment调用Activity的方法来实现通信。
三、Fragment+ViewPager懒加载
1、预加载
ViewPager默认会预加载左右两侧的一个页面,以方便用户滑动切换到相邻的界面时可以更加顺畅的显示出来。通过viewPager的setOffscreenPageLimit(int limit)可以设置预加载页面数量。
2、懒加载
-
说明
懒加载即延时加载,即等到该页面的UI展示给用户时再加载数据,而不是通过ViewPager预加载机制提前加载左右两侧和当前界面的数据,以提高Activity的初始化速度。
由于ViewPager的setOffscreenPageLimit(int limit)本身限定至少会加载左右两侧相邻的一个界面,无法通过ViewPager实现懒加载。
-
实现
利用Fragment实现
1、Fragment方法:setUserVisibleHint(boolean isVisibleToUser);
isVisibleToUser即表示该Fragment的UI对用户是否可见。当UI对用户可见性发生改变时自动调用。
2、onCreateView()
在onCreateView()方法执行完毕之前回调setUserVisibleHint(boolean isVisibleToUser);后如果进行数据加载和控件数据填充将会抛出空指针异常。
3、解决方法:
当对用户可见并且onCreateView()方法执行完毕之后再执行数据加载以实现懒加载。
示例代码:
package fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.View;
import tools.LogUit;
public abstract class BaseFragment extends Fragment{
private boolean isViewCreated;
private boolean isUIVisible;
protected final String TAG="FragmentPrint";
protected String fragmentName;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated=true;
lazyLoad();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser){
isUIVisible=true;
lazyLoad();
}
else {
isUIVisible=false;
}
}
//懒加载
private void lazyLoad() {
if (isViewCreated&&isUIVisible){
//如果UI可见并且onCreateView执行完毕
loadData();
isViewCreated=false;
isUIVisible=false;
LogUit.printLog("i",TAG,fragmentName+"可见");
}
}
//加载数据
protected abstract void loadData();
}