mus*_*off 3 android android-fragments android-jetpack android-architecture-navigation
我已经尝试了一段时间的导航组件,但是以某种方式没有得到当前导航组件生命周期背后的原因(或解释)。这里有一些需要澄清的地方。
在导航组件中,每次访问(或重新访问)时都会重新创建每个片段(或说页面)。因此,当您位于A并转到时B,它会A被销毁,之后再返回时A(如按返回按钮)A是从拉伸中创建的。
在传统的“活动”模式中,当您返回时,A它会一直指向,onResume因为移至时它并没有被破坏B。是否有任何原因在导航组件中更改了此模式?
重新创建的问题是,当您拥有大量数据并且需要花费一些时间来重绘时,感觉就像应用程序冻结了一样。一个简单的主页就是一个例子(例如Facebook NewsFeed)。可以使用保留数据来处理数据,ViewModel但是再次绘制所有提要需要时间,并且将冻结。
休闲产生了另一个问题。假设这样的场景:A有一个Collapsing AppBar带NestedScrollView。用户向下滚动并AppBar会折叠,然后用户移至其他页面B。当他返回时A,它将被重画并AppBar扩展。我不确定这是一个错误还是应该做些修复?因此,这里也欢迎任何解决方案。
如果出于某些原因(例如方向改变)而重新创建活动,则将重新创建导航组件中的每个页面,直到当前目标为止。尽管onCreate未onCreateView调用Fragment的方法,但我看不出在Activity休闲中创建Fragments的意义。任何解释都将受到欢迎。
导航组件目前仅支持片段替换。因此,您将无法像手动片段事务那样添加()片段。
但是,如果您担心要重新扩大布局并重新获取片段的数据,则可以使用以下两种方法轻松解决。
创建视图后,将其存储在变量中,并在调用onCreateView()时使用它。
private var view: View? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
if (view == null) {
view = inflater.inflate(R.layout.fragment_list, container, false)
//...
}
return view
}
Run Code Online (Sandbox Code Playgroud)
资料来源:https : //twitter.com/ianhlake/status/1103522856535638016
将ViewModel与Fragment一起使用,并将所需的数据作为成员变量保存。这样,替换关联的片段时不会清除数据。仅在片段的onDestroy()上清除ViewModel,这仅在销毁父活动时才会发生。https://developer.android.com/images/topic/libraries/architecture/viewmodel-lifecycle.png
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |