Kotlin - 片段生命周期导航问题;为什么子片段成为当前目的地?

如何解决Kotlin - 片段生命周期导航问题;为什么子片段成为当前目的地?

Kotlin/Android 新手。请耐心等待。

我的应用程序具有以下导航方案:带有导航控制器的底部导航视图,其中片段一、二和三是“顶级目的地”,我希望从中进一步在导航层次结构中向下导航。我在 this video tutorial 之后实施了该方案。

enter image description here

我的问题

片段三是一个二维码扫描仪。成功扫描后,我的目标是导航到片段 X。但是,当我到达导航点时,片段 X 已成为 currentDestination (findNavController().currentDestination) 并且导航失败并显示错误

java.lang.IllegalArgumentException: Navigation action/destination action_fragmentThree_to_fragmentX cannot be found from the current destination 

如果我改为从片段 Three 的 onCreate 导航到片段 X,则一切正常。因此,导航设置必须正确。

故障排除

我对片段生命周期知之甚少,但查看导致导航的片段的状态,我认为有些不对劲。

Fragment Three -> onResume()
// QR-CODE is scanned and QR-string is captured (`ImageAnalysis.Analyzer`); method in fragment Three gets executed

// Current destination = fragment Three

// Method in fragment Three validates the QR-string using some simple String extension methods. 

Fragment X -> onCreate()
Fragment X -> onCreateView()

// Current destination = fragment X

Fragment Three -> onPause()
Fragment Three -> onStop()
// Navigation fails

最有可能导致片段 X 被创建的原因是什么? 这是使它成为当前目的地的原因吗? 如果是这样,我该如何处理?强>

任何建议将不胜感激。如果您需要查看代码的某些部分,请告诉我。

编辑 1:

导航片段 X 也是当前导航片段。 Android Navigation Architecture Component - Get current visible fragment

EDIT 2 - 片段三 (ScanFragment) 代码

带回调的 imageAnalyzer 初始化,在片段 Threes onViewCreated

imageAnalyzer = ImageAnalyzer()
imageAnalyzer.codeWasScanned = { scannedCode ->
    if(!ScanningSession().isActive) { // internal class ScanningSession : Application() {}
        uponSuccessfulScan(scannedCode)
    }
}

fun uponSuccessfulScan(qrString: String) {

    // For debugging purposes
    println("ScanFragment || Scanned QR-code: $qrString")

    // Validate the code and handle it
    val identifierInScannedCode = ScanningSession().getIdentifierFor(qrString)

    println(identifierInScannedCode)

    if (identifierInScannedCode.isValid()) {

        println("ScanFragment || The QR-code is valid")

        if (identifierInScannedCode.isValidVehicleIdentifier()) {

            println("ScanFragment || Vehicle was scanned")

            if(!vehicleScanIsdisabled) {

                println("ScanFragment || Vehicle scan is enabled")
                // Prepare and navigate to fragment X

                println("Current destination: ${findNavController().currentDestination}")
                println("Current navigation fragment: ${activity?.supportFragmentManager?.currentNavigationFragment}")
                findNavController().navigate(R.id.action_scanFragment_to_fragmentX)

            } else {
                //Todo
            }

        } else if (identifierInScannedCode.isValidRoomOrPlaceIdentifier()){

            println("ScanFragment || Room or place was scanned")

        }

    } else {
        
        println("ScanFragment || The QR-code is NOT valid ")
        //presentInvalidCodeAlert()
    }

}

编辑 3 - ImageAnalyzer 代码

class ImageAnalyzer: ImageAnalysis.Analyzer {

    var codeWasScanned: ((String) -> Unit)? = null

    override fun analyze(imageProxy: ImageProxy) {
        scanBarcode(imageProxy)
    }

    @SuppressLint("UnsafeExperimentalUsageError")
    private fun scanBarcode(imageProxy: ImageProxy) {
        imageProxy.image?.let { image ->
            val inputimage = Inputimage.fromMediaimage(image,imageProxy.imageInfo.rotationdegrees)
            val scanner = BarcodeScanning.getClient()
            scanner.process(inputimage)
                .addOnCompleteListener {
                    imageProxy.close()
                    if (it.isSuccessful) {
                        readBarcodeData(it.result as List<Barcode>)
                    } else {
                        it.exception?.printstacktrace()
                    }
                }
        }
    }

    private fun readBarcodeData(barcodes: List<Barcode>) {
        for (barcode in barcodes) {
            when (barcode.valueType) {

                Barcode.TYPE_TEXT -> {
                    if (barcode.displayValue != null) {

                        this.codeWasScanned?.let { it(barcode.displayValue!!) }


                    } else {
                        // Tell user that the barcode Couldn't be read properly. Or any other guidance.
                    }

                }
            }
        }
    }
}

编辑 4:

好的,我玩了一下导航。我没有导航到片段 X,而是写了 findNavController().navigateUp()。这让我回到了预期的主要片段(片段 2)。但是,在成功扫描后导航到片段 X 后,下一次没有。

我猜因为我从来没有弹出片段 X 它被保存在一个活动/可见状态,这以某种方式搞砸了一切。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?