繁体   English   中英

Android 活动/片段在方向更改时重复(Kotlin)

[英]Android Activity/Fragment duplicates on orientation change (Kotlin)

我已经意识到,当我在我的应用程序的 mainActivity 上更改方向时,所有日志都开始重复,如果我再次这样做,它们会增加三倍,依此类推。 我假设活动每次都是从头开始创建的,但是由于我使用的是 navhost,所以我不知道如何制作它,所以它不会每次都重新创建。 MainActivity 基本上是空的(目前),并包含一个带有 ViewModel 的片段。

主要活动:

override fun onCreate(savedInstanceState: Bundle?) {

        if (BuildConfig.DEBUG) {
            Timber.plant(DebugTree())
        }
        Timber.w("Started")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

override fun onSupportNavigateUp() = findNavController(R.id.my_nav_host_fragment).navigateUp()

片段代码:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val v = inflater.inflate(R.layout.articles_fragment, container, false)

        Timber.w("oncreateview called")
        viewModel = ViewModelProvider(this).get(ArticlesViewModel::class.java)

        return v
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        Timber.w("onViewCreated called")
        initAdapter()
        super.onViewCreated(view, savedInstanceState)
    }

所以我所做的是在每个(不是全部)生命周期方法上设置一个日志,当应用程序启动时,它会每个打印一次,如果我翻转屏幕,它会打印两次,然后打印三次,依此类推。 如果我导航到另一个片段并返回它不会重复......它似乎主要是方向变化。 这是一个 Logcat 示例,我只从 Activity 中放置 onStart 并从片段中放置 onViewCreated ,所以它不会那么长:

W/MainActivity: Started
W/ArticlesFragment: onViewCreated called
W/MainActivity: Started
W/MainActivity: Started
W/ArticlesFragment: onViewCreated called
W/ArticlesFragment: onViewCreated called
W/MainActivity: Started
W/MainActivity: Started
W/MainActivity: Started
W/ArticlesFragment: onViewCreated called
W/ArticlesFragment: onViewCreated called
W/ArticlesFragment: onViewCreated called

所以每次我改变方向时,都会添加一个实例。 而且我相信实际上有三个实例在彼此之上运行,并且所有方法也重复了 3 次。 例如,我从 firestore 获取数据,当活动重复时,数据被读取两次,如果是三倍,则读取三倍,等等。

提前感谢任何非常感谢的帮助。 干杯!

如果有人有类似的问题,我发现我的问题是什么。

真正被复制的是 MainActivity 上的 Timber 树。

基本上是这样的: Timber.plant(DebugTree())需要被 null 包围,检查 savedInstanceState:

if (savedInstanceState==null) {
        if (BuildConfig.DEBUG) {
            Timber.plant(DebugTree())
        }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM