Reputation: 1889
I'm starting using fragments in android but I have doubts: 1.- is necessary using this part of code (newInstance, setArguments)?, if so, why?
public static class DetailsFragment extends Fragment {
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
http://developer.android.com/reference/android/os/Bundle.html
2.-if this code would have an OnCreate method, when will this be called?
Upvotes: 0
Views: 424
Reputation: 8911
1) Why is newInstance
needed?
newInstance
methods are needed because the framework encourages you to only ever have one constructor, taking no arguments. Having more than one constructor is somewhat frowned upon.
It needs this constructor to be public, so that it can recreate you Fragments when, for example, you undergo a configuration change. The same Bundle
that you passed to setArguments
on the original will be given to the copy too (as well as a savedInstanceState
Bundle
from onSaveInstanceState
).
Doing this for all fragments, including ones that have no arguments leads to consistent usage of fragments and ease of maintenance. Namely, do make sure to always pass an arguments Bundle
, even if it's empty, so that you don't have to check getArguments()
for null
.
2) onCreate
in the Fragment
lifecycle.
The Fragment
lifecycle is officially called "nested" but when adding new fragments I like to think of it as "playing catch up". For example, if your Activity has started (has had its onStart
called), your Fragment will get a rapid succession of onAttach
, onCreate
, onActivityCreated
, onCreateView
, onStart
in essence catching up to the Activity's lifecycle. You can enable debugging with FragmentManager.enableDebugLogging(true);
to track the lifecycle changes - look for moveto
(forward direction) and movefrom
(rewinding the cycle - destroying/detaching the fragment).
That said, onCreate
is kinda easy to predict - since you're probably first creating the fragment after onCreate
of the Activity, it would be called almost immediately when the transaction executes.
However, if you undergo a configuration change, the Fragments are destroyed with the old Activity and then created before the new Activity (it happens in that super.onCreate(savedInstanceState)
call that you have in your Activity) - onCreate
of all the fragments will be called before the Activity's onCreate
returns. Once it returns, the Fragments' onActivityCreated
will be called and from then on the fragments and activity will move in lockstep. This is all unless you have setRetainInstance(true)
, of course.
I hope this clears it up. I strongly suggest enabling debugging and just playing around with the fragments to get a better feeling for their lifecycles.
Upvotes: 4
Reputation: 6928
If you want to pass arguments to a fragment, the new instance method is necessary. You pass arguments this way, because fragments can be in a detached state, and when they are re added may need to be reinstantiated. Android will then call the newInstance method again with the same arguments, and your fragment will work correctly.
If you passed your arguments to an onCreate method (which is called only when the fragment is first created), then when a fragment is reinstantiated, it wouldn't get those arguments.
Upvotes: 0