一、前提
在開發(fā)應用的時候,一個Activity里面可能會用Viewpager+多個Fragment來結合使用,如果每個fragment都需要加載數(shù)據(jù),或者從本地加載,或者從網(wǎng)絡加載,那么在這個activity剛創(chuàng)建的時候就需要初始化大量資源,所以我們要做到當切換到這個fragment的時候,才讓它去初始化
二、代碼
LazyFragment.java
public abstract class LazyFragment extends Fragment {
/**
* rootView是否初始化標志,防止回調(diào)函數(shù)在rootView為空的時候觸發(fā)
*/
private boolean hasCreateView;
/**
* 當前Fragment是否處于可見狀態(tài)標志,防止因ViewPager的緩存機制而導致回調(diào)函數(shù)的觸發(fā)
*/
private boolean isFragmentVisible;
/**
* onCreateView()里返回的view,修飾為protected,所以子類繼承該類時,在onCreateView里必須對該變量進行初始化
*/
protected View rootView;
/* *
* 在這里實現(xiàn)fragment數(shù)據(jù)的緩加載,此方法是在onCreateView之前調(diào)用
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (rootView == null) {
return;
}
hasCreateView = true;
if (isVisibleToUser) {
onFragmentVisibleChange(true);
isFragmentVisible = true;
return;
}
if (isFragmentVisible) {
onFragmentVisibleChange(false);
isFragmentVisible = false;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initVariable();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!hasCreateView && getUserVisibleHint()) {
onFragmentVisibleChange(true);
isFragmentVisible = true;
}
}
private void initVariable() {
hasCreateView = false;
isFragmentVisible = false;
}
/**
* 當前fragment可見狀態(tài)發(fā)生變化時會回調(diào)該方法
* 如果當前fragment是第一次加載,等待onCreateView后才會回調(diào)該方法,其它情況回調(diào)時機跟 {@link #setUserVisibleHint(boolean)}一致
* 在該回調(diào)方法中你可以做一些加載數(shù)據(jù)操作,甚至是控件的操作,因為配合fragment的view復用機制,你不用擔心在對控件操作中會報 null 異常
*
* @param isVisible true 不可見 -> 可見
* false 可見 -> 不可見
*/
protected void onFragmentVisibleChange(boolean isVisible) {
}
}
FragmentOne.java
public class FragmentOne extends LazyFragment {
private FragmentLayoutBinding mBinding;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (rootView == null) {
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
rootView = mBinding.getRoot();
......
}
return rootView;
}
// isVisible true 不可見 -> 可見
// isVisible false 可見 -> 不可見
@Override
protected void onFragmentVisibleChange(boolean isVisible) {
super.onFragmentVisibleChange(isVisible);
//根據(jù)isVisible做后續(xù)操作
}