Fixed
Status Update
Comments
so...@gmail.com <so...@gmail.com> #2
I have a same problem.
Internally, NavController#navigateUp() calls popBackStack().
And popBackStack() calls popBackStack(currentDestination.id, inclusive=true).
public boolean popBackStack() {
if (mBackStack.isEmpty()) {
// Nothing to pop if the back stack is empty
return false;
}
// Pop just the current destination off the stack
return popBackStack(getCurrentDestination().getId(), true); <--- this is cause.
}
So I think,
this problem can't be fixed without navigation cmpt. modification. :(
Internally, NavController#navigateUp() calls popBackStack().
And popBackStack() calls popBackStack(currentDestination.id, inclusive=true).
public boolean popBackStack() {
if (mBackStack.isEmpty()) {
// Nothing to pop if the back stack is empty
return false;
}
// Pop just the current destination off the stack
return popBackStack(getCurrentDestination().getId(), true); <--- this is cause.
}
So I think,
this problem can't be fixed without navigation cmpt. modification. :(
so...@gmail.com <so...@gmail.com> #3
Component used: Navigation
Version used: 1.0.0-alpha09
But on alpha09 version, popBackStack() is implemented differently.
public boolean popBackStack() {
if (mBackStack.isEmpty()) {
throw new IllegalArgumentException("NavController back stack is empty");
}
boolean popped = false;
while (!mBackStack.isEmpty()) {
popped = mBackStack.removeLast().getNavigator().popBackStack(); <------ different
if (popped) {
break;
}
}
return popped;
}
Please restore to the upper codes. Or create a new option. :)
Version used: 1.0.0-alpha09
But on alpha09 version, popBackStack() is implemented differently.
public boolean popBackStack() {
if (mBackStack.isEmpty()) {
throw new IllegalArgumentException("NavController back stack is empty");
}
boolean popped = false;
while (!mBackStack.isEmpty()) {
popped = mBackStack.removeLast().getNavigator().popBackStack(); <------ different
if (popped) {
break;
}
}
return popped;
}
Please restore to the upper codes. Or create a new option. :)
il...@google.com <il...@google.com>
il...@google.com <il...@google.com>
ap...@google.com <ap...@google.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 45818ac652ba3a43b07f980cf22ab78be886d81d
Author: Ian Lake <ilake@google.com>
Date: Wed Jan 30 10:45:37 2019
Ensure that popBackStack() only pops one Fragment
When two Fragments with the same destination ID are
both added to the back stack, they previously had an
identical back stack name in FragmentManager, which
incorrectly means that popBackStack with that name
would pop both off the back stack.
By changing how we generate back stack names for
FragmentNavigator, we ensure that each back stack
name is unique and that only one Fragment will be
popped for each popBackStack() call.
Test: new FragmentNavigatorTest test
Change-Id: I26bdaeb65620001a74165a166aa74fe48cb468e6
Fixes: 123552990
M navigation/fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
M navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
https://android-review.googlesource.com/890733
https://goto.google.com/android-sha1/45818ac652ba3a43b07f980cf22ab78be886d81d
Branch: androidx-master-dev
commit 45818ac652ba3a43b07f980cf22ab78be886d81d
Author: Ian Lake <ilake@google.com>
Date: Wed Jan 30 10:45:37 2019
Ensure that popBackStack() only pops one Fragment
When two Fragments with the same destination ID are
both added to the back stack, they previously had an
identical back stack name in FragmentManager, which
incorrectly means that popBackStack with that name
would pop both off the back stack.
By changing how we generate back stack names for
FragmentNavigator, we ensure that each back stack
name is unique and that only one Fragment will be
popped for each popBackStack() call.
Test: new FragmentNavigatorTest test
Change-Id: I26bdaeb65620001a74165a166aa74fe48cb468e6
Fixes: 123552990
M navigation/fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
M navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
il...@google.com <il...@google.com> #6
This was regression introduced when fixing https://issuetracker.google.com/issues/110893637 - it is now fixed internally and will be available in the next release of Navigation.
ch...@gmail.com <ch...@gmail.com> #7
This is still not fixed. Steps to reproduce:
- Be on the initial Fragment (FragmentA)
- Press device back button (the back press will be consumed but nothing appears to happen)
- Click on a view that will cause an attempt to navigate to FragmentB
- Crash
- Be on the initial Fragment (FragmentA)
- Press device back button (the back press will be consumed but nothing appears to happen)
- Click on a view that will cause an attempt to navigate to FragmentB
- Crash
il...@google.com <il...@google.com> #8
Re #7 - please file a new bug with a sample project that reproduces your issue.
Description
Version used: 1.0.0-alpha11
I'm seeing some strange behaviour when pressing back button and transistion back to a fragment from a fragment of the same id.
My app uses some generic fragment structures that are driven by args passed in, as such there are places like:
FragmentA -> FragmentB -> FragmentB -> FragmentC
However if the back button is pressed on the second instance of FragmentB, FragmentA is replaced in the navhost while the navgraph correctly displays in the toolbar. Forward navigation from this point however is missing from the navgraph and results in an IllegalStateException with the action 'not found' in the graph, unless the back button is pressed again (pushing the navgraph destination back to FragmentA)
Is this intended behaviour? If so is there a way to declare FragmentB as 'stackable'?