片段未附加到上下文 - 延迟的 UI 更改

Posted

技术标签:

【中文标题】片段未附加到上下文 - 延迟的 UI 更改【英文标题】:Fragment not attached to a context - Delayed UI changes 【发布时间】:2022-01-15 10:35:50 【问题描述】:

我正在使用 Fragment,在特定的 Fragment 中,我需要在延迟后更改 UI。我在网上找到了一些允许我这样做的代码(使用 Timer + CoroutineScope 来触摸视图)。

timer.schedule(object : TimerTask() 
            override fun run() 
                MainScope().launch 
                    withContext(Dispatchers.Default) 
                    
                    changeUI(requireContext())
                
            
        , 800)

它可以完成工作,但我确信这不是最佳实践(我对编程比较陌生,所以请不要对它太苛刻)。问题是我需要将上下文传递给更改 UI 的方法,并且我偶尔会收到 IllegalStageException,因为 Fragment 未附加到上下文。

知道如何解决这个问题吗?有没有更好的方法来处理 UI 中的延迟更改?

如果有任何帮助,我将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

那是因为Fragments 跟随android lifecycle,在lifecycle 中存在无法操纵其视图的状态。这通常发生在 Fragment 在屏幕上实际上不可见时。

timer.schedule(object : TimerTask() 
            override fun run() 
                MainScope().launch 
                    withContext(Dispatchers.Default) 
                    
                    if(isAdded())
                          changeUI(requireContext())                    
                    
                
            
        , 800)

您可以通过调用isAdded()来检查Fragment是否处于有效状态以操纵其视图

【讨论】:

感谢您的回答!这样的状态会是什么?比如 onPause、onStop?您能否让我知道我使用的解决方案(计时器 + MainScope)是否是好的做法,或者我是否应该使用替代代码?谢谢!感谢您的帮助。 是的,这些是状态或阶段,只需在Android Lifecycle 上快速搜索一下。理想情况下,您需要一种Lifecyle 感知方法。这是一个使用 CountDownTimer mahendranv.github.io/posts/timer 的例子,因为 TimerCountDownTimer 是不同的,因此您必须将其调整为适合您当前的用例。它至少会给你一个提示,告诉你如何让 Lifecycle 意识到一些事情。您还可以将计时器粘贴在 ViewModel 中,并通过 LiveData 发布更改,observers 本身是 Lifecycle 知道的。

以上是关于片段未附加到上下文 - 延迟的 UI 更改的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalStateException:未附加到上下文的片段

何时片段不附加到活动而仅附加到上下文?

更改无法识别我的 NSFetchedResultsController 附加到后台线程

向 Kendo UI 上下文菜单项添加附加数据

EF6 无法将分离的实体附加到上下文

传递嵌套在片段中的 AdapterView.OnItemClickListener() 中的活动上下文 - 方法未定义