gpt4 book ai didi

android - 使用 Jetpack 的 Android 导航组件销毁/重新创建的 fragment

转载 作者:行者123 更新时间:2023-12-02 23:03:42 25 4
gpt4 key购买 nike

我正在尝试实现 Navigation with Jetpack's architecture components在我现有的应用程序中。

我有一个 Activity 应用程序,其中主 fragment (ListFragment) 是项目列表。目前,当用户点击列表项时,第二个 fragment 会通过 FragmentTransaction.add(R.id.main,DetailFragment) 添加到堆栈中。因此,当按下返回键时,DetailFragment 会分离,ListFragment 会再次显示。

通过导航架构,这是自动处理的。它不是添加新 fragment 而是 replaced ,因此 fragment View 被销毁,onDestroyView()被调用,并且onCreateView()被调用,当按下back键重新创建 View 时。

我知道这是与 LiveData 一起使用的一个很好的模式和 ViewModel以避免使用不必要的内存,但在我的情况下,这很烦人,因为列表具有复杂的布局,并且膨胀它会消耗时间和 CPU,还因为我需要保存列表的滚动位置并再次滚动到用户离开 fragment 的相同位置。这是可能的,但似乎应该存在更好的方式。

我尝试将 View “保存”在 fragment 的私有(private)字段中,并在 onCreateView() 上重新使用它(如果已经存在),但这似乎是一种反模式。

private View view = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

if (view == null) {
view = inflater.inflate(R.layout.fragment_list, container, false);
//...
}

return view;
}

还有其他更优雅的方法来避免重新膨胀布局吗?

最佳答案

谷歌的

Ian Lake 回复我,我们可以将 View 存储在变量中而不是增加新的布局,只需在 onCreateView()

上返回 预存储 View 的实例即可

来源:https://twitter.com/ianhlake/status/1103522856535638016

Leakcanary 可能会将其显示为泄漏,但其误报..

关于android - 使用 Jetpack 的 Android 导航组件销毁/重新创建的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com