当前位置: 首页 > 知识库问答 >
问题:

使用NavController导航时只允许一个实例

葛磊
2023-03-14

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

共有3个答案

薄高懿
2023-03-14

在导航到目标之前添加检查,因为它不会添加新实例。

class A: AppCompatActivity {

    fun onCreate(...) {
        // ...While navigating
        if (navController.currentDestination?.id != desiredDestination?.id) {
            navController.navigate(desiredDestination)
        }
        // ...else do nothing
    }
}

从NavController回调:https://developer.android.com/reference/androidx/navigation/NavController#addOnDestinationChangedListener(androidx.navigation.NavController. OnDestinationChangedListener)

徐卓
2023-03-14

您可以使用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)
    }
姬安志
2023-03-14

您可以通过navGraphViewModels使用委托

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

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

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

同时检查以下链接:

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

Android导航组件:如何保存片段状态

 类似资料:
  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A

  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 我目前正在我的项目中使用Android导航架构。它有一个功能,可以使用快捷方式启动任何片段。假设我的导航图如下所示:A-

  • 问题内容: 我正在使用RxJava计算Android中某些传感器数据的标准化自动相关性。奇怪的是,我的代码引发了一个异常(“ java.lang.IllegalStateException:只允许一个订阅者!”),我不确定该怎么做:我知道GroupedObservables订阅多个订阅者时可能会抛出此异常,但是我不认为我在任何地方都在使用这种东西。 在下面,您找到(最有可能)触发异常的方法: 这是

  • 问题内容: 我需要防止用户多次启动我的Java应用程序(WebStart Swing应用程序)。因此,如果应用程序已经在运行,则应该无法再次启动它或显示警告/再次关闭它。 有一些方便的方法可以做到这一点吗?我考虑过要阻止端口或将某物写入文件。但是希望您可以访问某些系统属性或JVM? 顺便说一句 目标平台是带有Java 1.5的Windows XP 问题答案: 我认为您的建议是在启动应用程序时打开端

  • 我有一个包裹 现在我想禁止在之外的实现,但是应该是公共的,因为我将其用于。 如何做到这一点? 这有什么“套餐最终模式”吗? 你有过这样的情况吗? 详情: 我知道有可能只使用带有包私有构造函数的抽象类,而不是接口,但是和扩展不同的类,因此我需要多重继承(因为模拟多重继承(例如,见有效的Java项目18)在这里不起作用)。