【问题标题】:Only allow one instance when navigate with NavController使用 NavController 导航时只允许一个实例
【发布时间】:2019-08-10 09:25:36
【问题描述】:

我目前在我的项目中使用 Android 导航架构。它具有可以使用快捷方式启动任何片段的功能。目前,我正在使用 NavController 在单击快捷方式时导航到所需的目的地。 但是当我多次单击快捷方式时,每次都会创建一个新的片段实例。 所以,我的问题是,有没有办法在使用 NavController 导航到片段时只接受一个片段实例? 我在谷歌上搜索了很多次,但一无所获。提前致谢。

【问题讨论】:

  • 将 ViewPager 与片段一起使用。 ViewPager 保留片段的实例。
  • 您是否使用 nav_graph 的操作进行导航??
  • 你解决了吗?

标签: android android-architecture-navigation


【解决方案1】:

你可以使用by navGraphViewModels委托

最重要的是为你的视图设置id,以便在配置更改期间保存状态。这在官方文档中没有提到。

默认情况下,在配置更改(旋转和...)期间不会保存片段导航。

ViewModel 将在配置更改后保持不变,您可以在那里保存状态然后恢复它。

同时检查这些链接:

https://code.luasoftware.com/tutorials/android/android-jetpack-navigation-lost-state-after-navigation/

Android navigation component: how save fragment state

【讨论】:

    【解决方案2】:

    您可以使用 safeOnClickListener 而不是默认的 onClickListener 来捕获快捷方式的点击,因此基本上使用 safeOnClickListener 您可以忽略给定持续时间的所有点击事件。

        class SafeClickListener(
            private var defaultInterval: Int = 2000,
            private val onSafeCLick: (View) -> Unit
        ) : View.OnClickListener {
    
            private var lastTimeClicked: Long = 0
    
            override fun onClick(v: View) {
                if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
                    return
                }
                lastTimeClicked = SystemClock.elapsedRealtime()
                onSafeCLick(v)
            }
        }
    
        fun View.setSafeOnClickListener(delay: Int = 2000, onSafeClick: (View) -> Unit) {
            val safeClickListener = SafeClickListener(delay) {
                onSafeClick(it)
            }
            setOnClickListener(safeClickListener)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2020-05-09
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多