You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment替换操作过慢,如何监听其提交完成状态?

监听Fragment事务提交完成的方法

当然有办法监听Fragment事务的完成状态!下面给你几种实用的方案,帮你在事务结束后准确隐藏进度条:

方法一:使用FragmentTransaction的完成回调(推荐,AndroidX 可用)

从AndroidX的Fragment库开始,FragmentTransaction提供了addOnCompleteListener()方法,能直接监听事务是否执行完成,这是最直接且不阻塞主线程的方式:

@Override 
public void onDrawerClosed(@NonNull View drawerView) { 
    if (mFragmentToSet != null) { 
        ProgressBar progressBar = findViewById(R.id.progressBar);
        progressBar.setVisibility(View.VISIBLE); 
        
        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.flContent, mFragmentToSet)
            .addOnCompleteListener(new FragmentTransaction.OnCompleteListener() {
                @Override
                public void onComplete(@NonNull FragmentTransaction transaction) {
                    // 事务执行完成,隐藏进度条
                    progressBar.setVisibility(View.GONE);
                }
            })
            .commit(); 
    }
}

方法二:同步提交事务(慎用,避免UI卡顿)

如果你使用commitNow()代替commit(),事务会同步执行,执行完毕后可以直接隐藏进度条。但要注意:commitNow()会阻塞主线程,如果你的Fragment初始化逻辑较重,可能导致界面卡顿,仅适合简单Fragment场景:

@Override 
public void onDrawerClosed(@NonNull View drawerView) { 
    if (mFragmentToSet != null) { 
        ProgressBar progressBar = findViewById(R.id.progressBar);
        progressBar.setVisibility(View.VISIBLE); 
        
        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.flContent, mFragmentToSet)
            .commitNow(); 
            
        // 事务已同步完成,直接隐藏进度条
        progressBar.setVisibility(View.GONE);
    }
}

方法三:监听Fragment的生命周期回调

如果你的项目还未迁移到AndroidX,或者需要更细粒度的状态监听,可以给FragmentManager注册生命周期回调,在目标Fragment完成视图创建后隐藏进度条:

@Override 
public void onDrawerClosed(@NonNull View drawerView) { 
    if (mFragmentToSet != null) { 
        ProgressBar progressBar = findViewById(R.id.progressBar);
        progressBar.setVisibility(View.VISIBLE); 

        // 注册Fragment生命周期回调
        getSupportFragmentManager().registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
            @Override
            public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull View v, @Nullable Bundle savedInstanceState) {
                super.onFragmentViewCreated(fm, f, v, savedInstanceState);
                // 确认是目标Fragment后隐藏进度条,并注销回调避免内存泄漏
                if (f == mFragmentToSet) {
                    progressBar.setVisibility(View.GONE);
                    fm.unregisterFragmentLifecycleCallbacks(this);
                }
            }
        }, false);
        
        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.flContent, mFragmentToSet)
            .commit(); 
    }
}

额外优化提示

你觉得Fragment替换慢,可能是因为Fragment初始化时做了大量同步操作(比如网络请求、复杂视图渲染),可以考虑:

  • 给Fragment实现懒加载:把耗时操作移到onResume()而非onCreateView()中执行;
  • 用ViewPager2+FragmentStateAdapter做预加载优化,提前初始化即将显示的Fragment。

内容的提问来源于stack exchange,提问作者cheuk law

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:27:24