android-fragments 在FragmentManager提交后执行函数

tsm1rwdh  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(142)

我有一个工具栏,其中的文本在选择菜单中的项目后会更新。
问题是,我在事务处理后立即调用工具栏中处理标题的函数,如下所示:

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment, fragment)
        .addToBackStack(null)
        .commit()
setTitle()

但是,当调用我的函数时,得到的片段总是当前显示的片段,而不是新的片段。

supportFragmentManager.fragments.last()

我猜Fragments事务是在一个线程中进行的。我如何等到它完成后才执行我的函数呢?

x6h2sr28

x6h2sr281#

如果您使用KTX扩展,您可以等待使用LifecycleScope创建片段,而不是直接监听片段管理器。
首先,确保您的应用级别build.gradle中具有fragment-ktx依赖关系:

dependencies {
    ...
    implementation 'androidx.fragment:fragment-ktx:1.2.1'
    ...
}

然后,您可以执行一个挂起的执行,等待创建片段:

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment, fragment)
        .addToBackStack(null)
        .commit()
fragment.lifecycleScope.launchWhenCreated { 
    setTitle()
}
yhuiod9q

yhuiod9q2#

由于您没有将片段添加到后栈,因此不能使用内置的FragmentManager.OnBackStackChangedListener,因此您可以在提交事务后立即调用executePendingTransactions(),或者使用commitNow()方法而不是commit()来执行相同的操作,然后使用setTitle()处理工具栏更改。

pgx2nnw8

pgx2nnw83#

我想我这么晚才回答你的问题,但它可以帮助那些想要同样解决方案的人:

fragment.getLifecycle().addObserver(new LifecycleEventObserver() {
                     @Override
                     public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                         if(event.getTargetState() == Lifecycle.State.RESUMED){
                             new Handler().postDelayed(new Runnable() {
                                 @Override
                                 public void run() {
                                    setTitle();
                                 }
                             }, 500);
                         }
                     }
                 });

相关问题