Reputation: 178
https://github.com/xxv/android-lifecycle shows that fragment onAttach, onCreate, on CreateView, and onActivityCreated are invoked prior to activity onStart. However, I tried logging this:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("TRACE", "MainActivity onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment firstFragment = FirstFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.content, firstFragment).commit();
}
@Override
public void onStart() {
Log.e("TRACE", "MainActivity onStart");
super.onStart();
}
FirstFragment looks like this:
public class FirstFragment extends Fragment {
public FirstFragment() {
// Required empty public constructor
}
public static FirstFragment newInstance() {
FirstFragment fragment = new FirstFragment();
return fragment;
}
@Override
public void onAttach(Context context) {
Log.d("TRACE", "FirstFragment onAttach");
super.onAttach(context);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("TRACE", "FirstFragment onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d("TRACE", "FirstFragment onCreateView");
return inflater.inflate(R.layout.fragment_first, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.d("TRACE", "FirstFragment onActivityCreated");
super.onActivityCreated(savedInstanceState);
}
And it printed this:
Upvotes: 0
Views: 589
Reputation: 54194
It depends on how the Fragment
is added to the Activity
.
There are two common ways to add a fragment to an activity: via a <fragment>
tag in XML or via a FragmentTransaction
executed in Java.
If, instead of providing an R.id.content
view and using a FragmentTransaction
, you create your FirstFragment
by using an activity layout like this one:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.example.stackoverflow.FirstFragment"/>
</LinearLayout>
You'll see this in the logs:
E/TRACE ( 6094): MainActivity onCreate D/TRACE ( 6094): FirstFragment onAttach D/TRACE ( 6094): FirstFragment onCreate D/TRACE ( 6094): FirstFragment onCreateView E/TRACE ( 6094): MainActivity onStart D/TRACE ( 6094): FirstFragment onActivityCreated E/TRACE ( 6094): MainActivity onResume
As for why you're seeing the messages in the order you see them when using a FragmentTransaction
, it comes down to the fact that the transaction is asynchronous; there's no guarantee that it will be executed as soon as you call commit()
. In your case, the system doesn't actually get around to executing it until after your activity's onStart()
.
Upvotes: 1