first of, I know that it is not possible to start a fragment via an Intent like you do with activities. However, in my application I would like to have the functionality that I can return from the activity to a fragment on a button click.
How do I do that? Any suggestions?
You can't "return from an Activity to a Fragment", simply because Fragments need to be put somewhere. Which means that hey need an Activity as a container. Putting aside some dirty overlay tricks.
So in the usual cases, you need an Activity to hold your Fragments. And since you have an Activity, you can have an intent-filter to handle your intent.
Activity hosts fragment, I think you should return to an Activity and select the correct Fragment. But there's always problem if you wanna select a Fragment freely, because you might have had a Fragment-Stack. If you don't have, ignore what I wrote below.
You have maybe three chance to reach your points. If you've called addBackStack, by default the Android use a backstack to control your Fragments, you have no chance to select your Fragments freely. so....
Chance 1 maybe worse case: Do not use addBackStack, and always use replace to finish your fragment's transaction.
Chance 2: Use FragmentTabHost. Then you can free select your fragments you've created, but be care of their life-cycles.
Chance 3: Use ViewPager, u know it ! :)
Related
I would like to check if a fragment was created for the first time so that I can launch a different fragment for introduction before coming to the retained fragment.
Normally for an activity I know I would use a sharedPreference-object to store a boolean value that tells me if this is the first time the user opens the activity, check the preference when the user starts the application, and if it returns true then show the middle screen.
Is the same possible for fragments?
Yes, you can use sharedPrference, but maybe it will be better to check the state when you actually switch to this fragment.
I mean you can decide in activity if to show introduction fragment or regular one before you create the fragment.
I want to remove a fragment from backstack and put another fragment in its place which hasn't been created yet. Below is a picture of what I want to achieve.
Is there any way to accomplish this?
EDIT:
As pointed out by #Elltz, it's not possible. So my question becomes
Is it possible to destroy the last fragment from back stack?
Can I handle the back button pressed manually to provide a different fragment than what is on the back stack?
NO! NO! NO !
want to remove a fragment from backstack and put another fragment
you can not manually re-arrange the BackstackEntry. you can only listen,observe and call it. look into PopBackstack(String name, int flags) hence the first no
and put another fragment in its place which hasn't been created yet
you mean a null Fragment ?.. you can not also assign references to null object, the second no
Is there any way to accomplish this?
A confirmation No.
EDIT
YES! YES! YES!
Is it possible to destroy the last fragment from back stack?
you can; using FragmentManager & FragmentTransaction
FragmentManager fm = FragmentActivity.getSupportFragmentManager();
fm.beginTransaction().remove(
fm.getBackStackEntryAt(fm.getBackStackEntryCount()-1););
the first yes
Can I handle the back button pressed manually to provide a different fragment than what is on the back stack?
Yes, you can, but you have to do it in your FragmentActivity or Activity so you will need some interface or your own logic around that, or
with your own logic implementing BackStackChangedListener, this is actually the interface i was talking about with logic, this listener gets notified anytime a Fragment goes or leaves the Backstack, hence the second yes
Third yes was for pampering.
Hope it helps Sir.
You cannot actually do this, but what you can do is, make these tansitions but hidden
go to fragment 3 from fragment 2
go to fragment 4 from 3.
By hidden I mean, that user does not see this happening (you can set the layout visibility as gone).
But this way, Fragment 2 will be in the stack.
To take out fragment 2 from the stack, do the following hidden operations:
go back to 1
go to 3 from 1
go to 4 from 3.
Hope this helps.
I need a way to share Fragments through different activities, so for example I have MainActivity with a Fragment and when I go to SecondActivity I need that same Fragment loaded, but the Fragment can vary so it would not always be the same one.
I've guessed that I could get the actual Fragments id or tag and pass it on the Intent so I could retrieve it on SecondActivity and use it to load the correct Fragment, but I don't know how.
You can't. You have to create a new instance for the fragment and load again the data in it. If you created the fragment in a good way, it is a really simple task. The reasons why you can't reuse the fragment are the following:
If you could do something like that, what would happend to this fragment's lifecycle? What about going back from current activity to the other? Everything can be messed up.
Every activity has its own FragmentManager and they are never shared between activities, so you can't ask in another's activity for a fragment that doesn't belongs to it.
If you have some doubts on how to pass data using intents between activities to tell the fragment what to load, have a look at this post.
I have this situation that I am not sure about the right design/way of doing things.
I have an activity where user would spend most of his time (Call it Activity A). Then the user can go to another activity where it is more graphics intensive (Call it activity B). Activity B would have around 40 Imageviews that have looping drawable animations. The user will be navigating back and fourth between those activities multiple times.
Is the expectation to create Activity B every time the user navigate to it and reinitalize the the 40 views based on the stored Data in my application class (it has coordinates and the type of view created)?
Or is there better way?
Thank you
You can use Following flag with intent to resume same activity without recreating it:
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Instead of using activities, you can use fragmentA and fragmentB
When you switch between two fragments, data of them will not be lost.
learn about fragment here
you can use fragments with in the single activity. fragments are easy to swicth between another fragment. so did not lose data of another fragment.
Its possible to retain a Fragment between Activities?
Lets say I have Activity A with Fragment F_Left placed at the left and Fragment F_Right placed at the right. If I want to launch a new Activity and keep Fragment F_Left... how can I do it?
Can I retain Fragment F_Left state between activities?
Note that I want to launch a new Activity because Fragment F_Left is my app menu and Fragment F_Right changes completely the context of the user operations... and my app have many of operations, so it makes sense to have an Activity per operation.
I know its possible to retain Fragment within an Activity, but as Fragment life cycle is closely tied to the container Activity I don't know if this is possible keep Fragment state between Activities.
Since API Level 13 (HONEYCOMB_MR2, June 2011), you can save and restore the state of a fragment across activities.
To save the state, use FragmentManager.saveFragmentInstanceState(), providing a reference to the Fragment whose state you wish to save. The Fragment must be attached at the time you attempt to save its state.
To restore the state, use Fragment.setInitialSavedState() with the return value when you instenciate the same Fragment.
myFragment = new MyFragment();
myFragment.setInitialSavedState(appState.getMyFragmentState());
fragmentManager.beginTransaction().add(R.id.container, myFragment).commit();
You can persist the SavedState object across activities as you would any other object; one way is to subclass Application as shown above (appState is the instance of our subclass).
Based on your response to my comment, I have a slightly different answer. It may not end up being the best answer in your specific situation, I'll let you decide that. :)
Right now you are bundling your fragments in activities because that is what made sense to you, but really, you can probably treat the entire process as one activity and use fragment transactions to hide & show (or create and destroy) fragments as needed.
Since you won't be creating and destroying activities, your menu fragment on the left will be left untouched, and you won't have any problems with its UI state. The set of operations you want to run (which no doubt includes all sorts of different fragments on the right) does not need to be launched in a new activity - but you will have to find a way to manage the logic you need for the fragment transactions (either in your one über-activity or in some kind of OperationsManager class).
I think this will end up being a lot smoother for the users of your application since the single activity just remains running - and you are only changing the parts that actually need to change.
If I want to launch a new Activity and keep Fragment F_Left... how can I do it?
Don't launch a new activity.
Can I retain Fragment F_Left state between activities?
Not automatically. It is not the same fragment. You would pass data between the activities for use by the fragment no differently than you would without any fragments at all.
To potentially answer your original question, if you fire off another activity then I believe that you can save your fragment from your first activity by calling FragmentManager::putFragment(...) when onSaveInstanceState(...) is called and then getting it back later, e.g. in onCreate(...).
However, I have to agree with Mark D's response.
Incidentally I'm doing something similar in that I have a dual pane setup whereby the left pane if fixed with a number of options with each option invoking a different fragment in the right pane. Furthermore selecting an entry in the right pane can result in the right fragment being replaced by another one.
However, I have taken the approach whereby by left fragment is only responsible for displaying and handling responses from the immediate fragment which appears in the right hand pane. Furthermore each right-hand fragment is then responsible for 'replacing' itself with a new fragment and handling results sent back to it. I'm using setTargetFragment, getTargetFragment, and calling onto the target fragment's onActivityResult method to pass results back.
For me the approach I've taken is no different from when my app runs on a phone with a single pane whereby the initial option's activity only knows about the activies it fires off and subsequently these new ones fire off further activies which they know about.
It should be mentioned that my activity in my dual pane app doesn't really do much apart from loading the left pane fragment and I can't quite see the need for a single activity to ever have to manage hundreds of fragments.