<span style="font-size:18px;">import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* <pre>
* 若把初始化内容放到initData实现
* 就是采用Lazy方式加载的Fragment
* 若不需要Lazy加载则initData方法内留空,初始化内容放到initViews即可
*
* 注1:
* 如果是与ViewPager一起使用,调用的是setUserVisibleHint。
*
* 注2:
* 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.
* 针对初始就show的Fragment 为了触发onHiddenChanged事件 达到lazy效果 需要先hide再show
* eg:
* transaction.hide(aFragment);
* transaction.show(aFragment);
*
* Created by Mumu
* on 2015/11/2.
* </pre>
*/
public abstract class BaseFragment extends Fragment {
/**
* Fragment title
*/
public String fragmentTitle;
/**
* 是否可见状态
*/
private boolean isVisible;
/**
* 标志位,View已经初始化完成。
*/
private boolean isPrepared;
/**
* 是否第一次加载
*/
private boolean isFirstLoad = true;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
isFirstLoad = true;
View view = initViews(inflater, container, savedInstanceState);
isPrepared = true;
lazyLoad();
return view;
}
/**
* 如果是与ViewPager一起使用,调用的是setUserVisibleHint
*
* @param isVisibleToUser 是否显示出来了
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.
* 若是初始就show的Fragment 为了触发该事件 需要先hide再show
*
* @param hidden
*/
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible() {
lazyLoad();
}
protected void onInvisible() {
}
/**
* 要实现延迟加载Fragment内容,需要在 onCreateView
* isPrepared = true;
*/
protected void lazyLoad() {
if (!isPrepared || !isVisible || !isFirstLoad) {
return;
}
isFirstLoad = false;
initData();
}
protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
protected abstract void initData();
public String getTitle() {
if (null == fragmentTitle) {
setDefaultFragmentTitle(null);
}
return TextUtils.isEmpty(fragmentTitle) ? "" : fragmentTitle;
}
public void setTitle(String title) {
fragmentTitle = title;
}
/**
* 设置fragment的Title直接调用 {@link BaseFragment#setTitle(String)},若不显示该title 可以不做处理
*
* @param title 一般用于显示在TabLayout的标题
*/
protected abstract void setDefaultFragmentTitle(String title);
}</span>