5 votes

Contrôleur de navigation et BroadcastReceiver

J'ai actuellement un problème pour trouver la NavigationController à partir d'une instance BroadcastReceiver contexte. Lorsque j'appelle findNavigationController() de n'importe où ailleurs dans le Fragment il navigue sans problème, mais lorsque je l'appelle depuis le contexte de l'application onReceive l'application se bloque avec l'exception suivante

 Caused by: java.lang.IllegalArgumentException: navigation destination app.eventcloud.events:id/action_documents_list_fragment_to_document_viewer_fragment is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:633)
    at androidx.navigation.NavController.navigate(NavController.java:592)
    at app.eventcloud.root.gui.screens.knowledgehub.DocumentsListFragment.handleDownloadCompleted(DocumentsListFragment.kt:97)
    at app.eventcloud.root.gui.screens.knowledgehub.DocumentsListFragment.access$handleDownloadCompleted(DocumentsListFragment.kt:26)
    at app.eventcloud.root.gui.screens.knowledgehub.DocumentsListFragment$receiver$1.onReceive(DocumentsListFragment.kt:143)
    at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1391)
    at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2) 
    at android.os.Handler.handleCallback(Handler.java:873) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Le code à l'origine du problème est le suivant.

private val receiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE == action) {
            ...
            val filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))
            val bundle = Bundle()
            bundle.putString("file_path", filePath)
            findNavController().navigate(R.id.action_documents_list_fragment_to_document_viewer_fragment, bundle)
            ...
        }
    }
}

J'ai essayé d'obtenir le NavigationController à partir d'un contexte extérieur à l BroadcastReceiver J'ai toujours le même problème. Avez-vous des idées ?

0voto

Calin Points 1217

Ce que j'ai fini par faire, c'est créer des liens profonds comme dans la documentation. https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing#Deeplink

Et ensuite démarrer l'activité en utilisant le lien profond configuré

            val deepLinkIntent = Intent(Intent.ACTION_VIEW)
            deepLinkIntent.data = Uri.parse("epix://downloads/$filePath")
            context.startActivity(deepLinkIntent)

Consultez également cette partie de codelab https://codelabs.developers.google.com/codelabs/Android-navigation/#10

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X