package com.example.lazyloadvp.Lazy2;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
public abstract class LazyFragment extends Fragment {
private View rootView = null;
// view是否被创建
private boolean mIsViewCreated = false;
//是否第一次创建
private boolean mIsFirstVisible = false;
//表示Fragment 不可见状态和再次回到可见状态
private boolean mCurrentVisibleState = false;
public abstract int getLayoutRes();
public abstract void initView(View view);
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(rootView == null){
rootView = inflater.inflate(getLayoutRes(),null);
}
initView(rootView);
mIsViewCreated = true;
//没有隐藏 并且可见 分发状态true
if(!isHidden() && getUserVisibleHint()){
dispatchUserVisibleHint(true);
}
return rootView;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(mIsViewCreated){
if(isVisibleToUser && !mCurrentVisibleState){
dispatchUserVisibleHint(true);
}else if(!isVisibleToUser && mCurrentVisibleState){
dispatchUserVisibleHint(false);
}
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden){
dispatchUserVisibleHint(false);
}else {
dispatchUserVisibleHint(true);
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
private void dispatchUserVisibleHint(boolean isVisible){
if(isVisible && isParentInvisible()){
return;
}
if(mCurrentVisibleState == isVisible){
return;
}
mCurrentVisibleState = isVisible;
if(isVisible){
if(mIsFirstVisible){
mIsFirstVisible = false;
onFragmentFirstVisible();
}
onFragmentResume();
dispatchChildUserVisibleHint(true);
}else {
onFragmentPause();
dispatchChildUserVisibleHint(false);
}
}
public boolean isParentInvisible(){
Fragment parentFragment = getParentFragment();
if(parentFragment instanceof LazyFragment){
LazyFragment lazyFragment = (LazyFragment) parentFragment;
return !lazyFragment.mCurrentVisibleState;
}
return false;
}
@Override
public void onResume() {
super.onResume();
if(!mIsFirstVisible){
if(!isHidden() && !mCurrentVisibleState && getUserVisibleHint()){
dispatchUserVisibleHint(true);
}
}
}
public void dispatchChildUserVisibleHint(boolean isVisible){
List<Fragment> fragments = getChildFragmentManager().getFragments();
if(fragments != null){
for(Fragment fragment : fragments){
if(fragment instanceof LazyFragment && !fragment.isHidden() && fragment.getUserVisibleHint()){
dispatchUserVisibleHint(isVisible);
}
}
}
}
@Override
public void onPause() {
super.onPause();
if(mCurrentVisibleState && getUserVisibleHint()){
dispatchUserVisibleHint(false);
}
}
public void onFragmentFirstVisible(){
}
public abstract void onFragmentResume();
public void onFragmentPause(){
}
}
考虑两层嵌套,很全面的懒加载Fragment
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 多层嵌套后的 Fragment 懒加载 印象中从 Feed 流应用流行开始,Fragment 懒加载变成了一个大家...
- https://blog.csdn.net/learningcoding/article/details/8004...
- 前言 在项目中我们可能需要获取Fragment可见或者不可见时的回调。(回调这个词在这里用的可能并不准确,这里理解...
- 成长记录-连载(三十六) ——我的第一篇五千字长文,说了什么,你一定想不到 并不是不想每天写公众号,而是之前思考怎...