关于Fragment的显示和隐藏 类似淘宝加载

关于Fragment的显示和隐藏 类似淘宝加载

Fragment管理办法
1:利用FragmentManager管理
2:利用ViewPager管理

两种情况下Fragment显示/隐藏的方法
1:FragmentManager中,add/show,调用onHiddenChanged(boolean)
2:ViewPager中,setCurrentItem,调用setUserVisibleHint(boolean)
不要混用,不要混用,不要混用

FragmentManager 情况下的坑
Fragment首次创建不会调用onHiddenChanged
FragmentManager add 一次,就会调用onCreat+onResume
乱七八糟,如何清晰?

解决办法
如果你的主Activity中,用的是FragmentManager,管理5个内容巨多的Fragment,参考淘宝
你又想实现那么省性能,最好的方式

1:当点击HomeActity中的Tab时,首先

 case 1:
 case 2:
                if ( fg2== null) {
                    fg2 = new Fragment02();
                    fragmentTransaction.add(R.id.content, fg2);
                } else {
                    fragmentTransaction.show(fg2);
                }
                break;
 case3:
 case4:
 case5:
.....

2:然后在每个Fragment中,

 //避免你的activity生命周期影响它
 private boolean canLoad=false,needLoad=true;
 
  	@Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if(rootView!=null){
            return rootView;
        }else {
            rootView = inflater.inflate(R.layout.fg02, null);
            //去各种findviewbyid操作
            canLoad=true;
            return rootView;
        }
    }
  	@Override
    public void onResume(){
        super.onResume();
        if(canLoad&&needLoad){
            //这里写首次展示的操作,比如setAdapter,网络请求等
            needLoad=false;
        }
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
    	//这里写每次页面隐藏/显示 你需要进行的操作,比如刷新 等
        if (hidden) {
            //TODO 被隐藏
        } else {
            //TODO 被展示
        }
    }
在Android中,你可以使用Fragment的`ViewTreeObserver`来监听其显示隐藏的变化。首先,你需要在Fragment的初始化或生命周期方法中设置`ViewTreeObserver`: ```java // 在onActivityCreated()或者onViewCreated()方法中添加 getActivity().getWindow().addWindowObserver(new WindowObserver() { @Override public void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); if (visibility == View.VISIBLE) { // 当窗口变为可见时 startListening(); // 开始监听显示变化 } else if (visibility == View.GONE || visibility == View.INVISIBLE) { // 当窗口变为不可见时 stopListening(); // 停止监听 } } private void startListening() { // 在这里开始你的监听逻辑,比如添加一个FragmentTransaction的监听器 FragmentManager fragmentManager = getFragmentManager(); fragmentManager.registerFragmentLifecycleCallbacks(new FragmentLifecycleCallback(), true); } private void stopListening() { // 当不再需要监听时,移除生命周期回调或者销毁观察者 FragmentManager fragmentManager = getFragmentManager(); fragmentManager.unregisterFragmentLifecycleCallbacks(lifecycleCallback); getActivity().getWindow().removeWindowObserver(this); } }); ``` 在这个例子中,`startListening()`会注册`FragmentLifecycleCallback`来跟踪Fragment的生命周期变化,包括隐藏显示。`stopListening()`则是在不需要监听时将其注销。 请注意,`WindowObserver`的监听可能会受到系统某些操作的影响,例如切换到其他应用或按下Home键。如果你只关心用户交互导致的隐藏显示,那么可以考虑使用`GestureDetector`或者其他专门用于触摸事件的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值