I have a problem for implementing up navigation on an app with this navigation tree:
The standard implementation of the back button is fine.
The problem start when trying to implement the Up button.
What I expect:
- when the user is on Detail 5 Activity and press the up button the app goes to List 3 Activity
- when the user is on Detail 7 Activity and press the up button the app goes back to Home Activity
So in different terms, I'd like to have this behaviour on the back stack:
The Android documentation (Implementing Ancestral Navigation) advice to use the following code to handle up navigation:
Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();
But because the parent activity of the Detail Activity differs on the different navigation path I don't know which one it really is. So I can't call it in the Intent.
Is there a way to know the real parent activity in the Android back stack?
If not, is there a way to implement a correct up navigation in this app?
this is an old post for sure, but as I was studying the SharedPreferences, I think it could be a possibility to stack this information within a sharedPreferences data, and to modify its value each time before going down the 2 parents. Then by reading it, you should be able to directly know your parent, and this without having to build a whole class for that.
That's a tricky question and in my opinion really shows the difficulties in coping with the UX decisions of Android for the "up button". Therefore, there's not a clear-cut answer to your problem.
I have two possible solutions for you.
1. Mimicking the back button behavior.
You could consider adding an extra to the intent for launching Detail from one of its various parents. This extra would inform those activities which activity they would need to launch when
android.R.id.home
is pressed.This would effectively mean that your app "goes back" to its common ancestor, instead of simply relaunching Home.
Another way of implementing this may be simply executing
onBackPressed()
instead of launching Home withIntent.FLAG_ACTIVITY_CLEAR_TOP
, but bear in mind that the associated animation would be different than a normal "up" action.2. Skip intermediate activites and go home.
Some apps treat the "up button" as a "home button". You might want to consider having it simply always relaunch Home with
Intent.FLAG_ACTIVITY_CLEAR_TOP
.I will stick with my comment on Paul's answer:
The idea is to have a Stack of the last
Parent
Activities traversed. Example:Now in all your parent activities (the activities that are considered parents -e.g. in your case: List and Home), you add this to their
onCreate
:When you want to return to the
Parent
activity, you can use the following (according to your code):I hope am right (: