bodo
07/13/2020, 2:03 PMArchie
07/27/2020, 9:40 AM<navigation xmlns:android="<http://schemas.android.com/apk/res/android>"
xmlns:app="<http://schemas.android.com/apk/res-auto>"
xmlns:tools="<http://schemas.android.com/tools>"
android:id="@+id/someId">
....
<fragment
android:id="@+id/someFragmentInModuleA"
android:name="ModuleAFragment">
<action
android:id="@+id/action_to_ModuleBFragment_which_is_in_Module_B"
app:destination="@id/someFragmentInModuleB"/> // But id dont have a reference to this ID so its red
</fragment>
....
</navigation>
Module B contains nav_graph_b.xml
<navigation xmlns:android="<http://schemas.android.com/apk/res/android>"
xmlns:app="<http://schemas.android.com/apk/res-auto>"
xmlns:tools="<http://schemas.android.com/tools>"
android:id="@+id/someId">
....
<fragment
android:id="@+id/someFragmentInModuleB"
android:name="ModuleBFragment">
</fragment>
....
</navigation>
I can't have ModuleA depende on ModuleB or vice versa...
What can you guys suggest? I know there is a Dynamic Navigation
but I'm not sure if I should use it for my usecase as its advertised as solution for Dynamic Feature Modules
to which my modules are not.George Theocharis
07/30/2020, 10:33 AMPetru
08/05/2020, 10:02 AMRamadan Al.
09/25/2020, 4:28 PMJoao Birk
10/06/2020, 2:39 PMonCreateView
, that needs to be refactored, but for now we are keeping a reference to the view:
private lateinit var binding: FragmentAbcBinding
and doing the following in that method:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
if (!::binding.isInitialized) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_abc, container, false)
} else {
val rootView = binding.root
(rootView.parent as? ViewGroup)?.removeView(rootView)
}
return binding.root
}
But for some reason, in some devices we are seeing the following crash:
*java.lang.IllegalStateException*:
at android.view.ViewGroup.addViewInner (ViewGroup.java:5958)
at android.view.ViewGroup.addView (ViewGroup.java:5777)
at androidx.fragment.app.FragmentContainerView.addView (FragmentContainerView.java:6)
Basically the binding.root
still has a view being returned when calling binding.root.getParent()
Unfortunately the stack trace doesn't tell me which fragment is throwing such exception.
We are using the https://github.com/android/architecture-components-samples/blob/master/NavigationAdvancedSample/app/src/main/java/com/example/android/navigationadvancedsample/NavigationExtensions.kt
Has anyone here faced this issue?George Theocharis
10/14/2020, 3:23 PMkevin.cianfarini
10/15/2020, 8:14 PMGeert
11/09/2020, 9:08 AMGeert
11/09/2020, 9:08 AM> Task :app:generateSafeArgsDebug FAILED
Caching disabled for task ':app:generateSafeArgsDebug' because:
Build cache is disabled
Task ':app:generateSafeArgsDebug' is not up-to-date because:
Input property 'navigationFiles' file /Users/geert/Desktop/MedxpertNav/app/src/main/res/navigation/.DS_Store has been added.
Input property 'navigationFiles' file /Users/geert/Desktop/MedxpertNav/app/src/main/res/navigation/mobile_navigation.xml has changed.
:app:generateSafeArgsDebug (Thread[Execution worker for ':' Thread 4,5,main]) completed. Took 0.028 secs.
:snomed:bundleLibCompileToJarDebug (Thread[Execution worker for ':' Thread 11,5,main]) completed. Took 0.837 secs.
:zorgkluisui:kaptDebugKotlin (Thread[Execution worker for ':' Thread 2,5,main]) completed. Took 10.228 secs.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:generateSafeArgsDebug'.
> org.xmlpull.v1.XmlPullParserException: only whitespace content allowed before start tag and not \u0 (position: START_DOCUMENT seen \u0... @1:1)
* Try:
Run with --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:generateSafeArgsDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:208)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:206)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:187)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.internal.UncheckedException: org.xmlpull.v1.XmlPullParserException: only whitespace content allowed before start tag and not \u0 (position: START_DOCUMENT seen \u0... @1:1)
* Get more help at <https://help.gradle.org>
BUILD FAILED in 4m 54s
108 actionable tasks: 21 executed, 87 up-to-date
MacBookPro:MedxpertNav (nav) $
Vivekpanchal64
11/21/2020, 11:45 AMKshitij Patil
12/07/2020, 7:19 PMjava.lang.IllegalArgumentException: No destination with ID 2131362278 is on the NavController's back stack. The current destination is Destination(ai.adagrad.gateguard:id/navigation_add_visitor) label=AddVisitorFragment class=ai.adagrad.gateguard.addvisitor.AddVisitorFragment
at androidx.navigation.NavController.getBackStackEntry(NavController.java:1295)
$inlined$navGraphViewModels$1.invoke(NavGraphViewModelLazy.kt:56)
$inlined$navGraphViewModels$1.invoke(NavGraphViewModelLazy.kt)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
$inlined$navGraphViewModels$2.invoke(NavGraphViewModelLazy.kt:59)
$inlined$navGraphViewModels$2.invoke(NavGraphViewModelLazy.kt)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:53)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at androidx.lifecycle.DispatchQueue.drainQueue(DispatchQueue.kt:75)
at androidx.lifecycle.DispatchQueue.enqueue(DispatchQueue.kt:107)
at androidx.lifecycle.DispatchQueue.runOrEnqueue(DispatchQueue.kt:97)
at androidx.lifecycle.PausingDispatcher.dispatch(PausingDispatcher.kt:182)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:305)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:27)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
at androidx.lifecycle.PausingDispatcherKt$whenStateAtLeast$2.invokeSuspend(PausingDispatcher.kt:162)
at androidx.lifecycle.PausingDispatcherKt$whenStateAtLeast$2.invoke(PausingDispatcher.kt)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:161)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
at androidx.lifecycle.PausingDispatcherKt.whenStateAtLeast(PausingDispatcher.kt:156)
at androidx.lifecycle.PausingDispatcherKt.whenCreated(PausingDispatcher.kt:42)
at androidx.lifecycle.LifecycleCoroutineScope$launchWhenCreated$1.invokeSuspend(Lifecycle.kt:74)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:342)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:27)
at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:109)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:158)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
at kotlinx.coroutines.BuildersKt.launch(Unknown Source)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:49)
at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source)
at androidx.lifecycle.LifecycleCoroutineScope.launchWhenCreated(Lifecycle.kt:73)
at androidx.fragment
This exception. Without updating any state, navigation works fine and I'm even able to view the argument on the UI, but the moment I pass it to the ViewModel, crash occurs
Edit: To give you more context, this fragment is hosting a FragmentContainerViewAness Iqbal
12/13/2020, 4:29 PMAness Iqbal
12/18/2020, 9:28 PMview?.findNavController()?.popBackStack(R.id.dashboard_fragment, false) // pop the stack till home.
and doing this right after above line
activity?.startActivityForResult(intent, HomeActivityRequestCode)
the problem here is I get view of Fragment A (dashboard fragment) for a second while starting Activity 2 from Fragment D. How can I avoid the view of Fragment A when going from Fragment D to Activity 2.
Note: I am using activity for results currently if there is some better approach other than that, please do help me with that.SimonT
03/04/2021, 9:40 PMsolidogen
05/24/2021, 12:59 PMTepes Lucian Victor
06/22/2021, 3:16 PMsunnat629
07/30/2021, 3:47 PMBottomNavigationView
has 3 tabs. But the main problem is tab 2 and tab 3 destroys when I click another tab. But Tab1 is not destroyed unless the MainActivity is destroyed. Is this normal? But why?
fragmentVersion = "1.4.0-alpha05"
and navVersion = "2.4.0-alpha05"
Vyshas
08/02/2021, 8:57 PMbinding.bottomNavigationView.setupWithNavController(navController)
If I use below, then bottom nav selection stops working.
binding.bottomNavigationView.setOnItemSelectedListener {
//track clicks
true
}
Tepes Lucian Victor
09/03/2021, 4:11 PM<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="<http://schemas.android.com/apk/res/android>"
xmlns:app="<http://schemas.android.com/apk/res-auto>"
android:id="@+id/main"
app:startDestination="@id/graph1">
<include app:graph="@navigation/graph1" />
<include app:graph="@navigation/graph2" />
<include app:graph="@navigation/graph3" />
<include app:graph="@navigation/auth" />
<action
android:id="@+id/action_to_auth"
app:destination="@id/auth"
app:popUpTo="@id/graph1"
app:popUpToInclusive="true"
app:launchSingleTop="true" />
<action
android:id="@+id/action_to_main"
app:destination="@id/graph1"
app:popUpTo="@id/auth"
app:popUpToInclusive="true"
app:launchSingleTop="true" />
</navigation>
When starting the app if the user is logged out i redirect to auth flow using the `action_to_auth`and when he logs out, i’m calling navigate(R.id.action_to_auth)
. The issue with multiple backstacks is that saved stacks aren’t cleared and there is no way to query what back stacks were previously saved into the fragment manager.Apex
09/10/2021, 5:14 PMApex
09/10/2021, 5:15 PMVivekpanchal64
11/30/2021, 5:06 AMCristina Uroz
05/29/2022, 1:47 PMDhaval Gondaliya
09/23/2022, 11:24 AMfindNavController()
in Application
class?Rafael Costa
10/02/2022, 9:13 PMwhy
04/12/2023, 1:54 PMnavOptions {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
restoreState = true
}
Vivekpanchal64
05/23/2023, 7:10 PMgalex
08/09/2023, 12:21 PMsaveStateHandle["id"]
to get an id from a deeplink.
When coming back from Fragment B to Fragment A, The ViewModel of Fragment A also receives the same parameter id
as the ViewModel of Fragment B receives it.
Weird or what am I missing here?Nacho Ruiz Martin
10/09/2023, 3:47 PMonBackPressed
on our Activities, navigation component’s popBackStack
is not called, only finish
, even if the graph is not on its root. Is this expected? Should we override the default back behaviour with OnBackPressedDispatcher
to manually call popBackStack
and finish
when the backstack is cleared out?