to sum up:
1, add overwrite the original fragment, added to a new fragment after the original fragment still alive
2, replace is to remove all the fragment out of the same id, then add the current fragment
From the performance, it is recommended to use replace ( in doubt, then under study )
1, add, replace, regardless of whether or not to add addToBackStack, would walk again fragment of the cycle;
2, FragmentA and FragmentB switch replace the same fragment is not going to take the life cycle.
3, FragmentA switch and replace FragmentB not add addToBackStack, every time the current fragment to be destroyed, and then add a new fragment, take all life cycle.
4, FragmentA and FragmentB switched replace add addToBackStack, will not destroy the current fragment.
First, the life cycle
Second, the difference add, replace, show, hide method
Call the add method
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment, homeFragmentA)
.commit();
Call and replace methods
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentA)
.commit();
add, replace, regardless of whether or not to add addToBackStack, logs are as follows:
com.heima.mynewdemo E/HomeFragmentA====: onAttach
com.heima.mynewdemo E/HomeFragmentA====: onCreate
com.heima.mynewdemo E/HomeFragmentA====: onCreateView
com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
com.heima.mynewdemo E/HomeFragmentA====: onStart
com.heima.mynewdemo E/HomeFragmentA====: onResume
com.heima.mynewdemo E/HomeFragmentA====: onPause
com.heima.mynewdemo E/HomeFragmentA====: onStop
com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
com.heima.mynewdemo E/HomeFragmentA====: onDestroy
com.heima.mynewdemo E/HomeFragmentA====: onDetach
Replace the use of homeFragmentA, homeFragmentB switch:
1, replace the same fragment is not going to take the life cycle.
2, using the replace switch
homeFragmentA = new HomeFragmentA();
homeFragmentB = new HomeFragmentB();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentA)
.commit();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentA, "homeFragment")
.commit();
}
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentB)
.commit();
}
});
}
Log is as follows:
2020-03-26 09:17:18.620 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:17:18.620 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:17:18.621 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:17:18.622 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:17:18.622 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:17:18.623 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onResume
2020-03-26 09:17:25.818 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onAttach
2020-03-26 09:17:25.818 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onCreate
2020-03-26 09:17:25.819 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onPause
2020-03-26 09:17:25.819 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onStop
2020-03-26 09:17:25.819 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
2020-03-26 09:17:25.821 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onDestroy
2020-03-26 09:17:25.821 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onDetach
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onCreateView
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onActivityCreated
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onStart
2020-03-26 09:17:25.823 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onResume
2020-03-26 09:17:34.905 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:17:34.905 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:17:34.906 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onPause
2020-03-26 09:17:34.906 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onStop
2020-03-26 09:17:34.906 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onDestroyView
2020-03-26 09:17:34.907 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onDestroy
2020-03-26 09:17:34.907 10090-10090/com.heima.mynewdemo E/HomeFragmentB====: onDetach
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:17:34.914 10090-10090/com.heima.mynewdemo E/HomeFragmentA====: onResume
Summary: every time the current fragment to be destroyed, and then add a new fragment, take all life cycle:
3. Add addToBackStack
homeFragmentA = new HomeFragmentA();
homeFragmentB = new HomeFragmentB();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentA)
.addToBackStack(null)
.commit();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentA, "homeFragment")
.addToBackStack(null)
.commit();
}
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentB)
.addToBackStack(null)
.commit();
}
});
}
Log is as follows:
2020-03-26 09:22:53.012 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:22:53.012 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:22:53.013 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:22:53.014 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:22:53.014 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:22:53.015 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onResume
2020-03-26 09:23:10.081 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onAttach
2020-03-26 09:23:10.081 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onCreate
2020-03-26 09:23:10.081 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onPause
2020-03-26 09:23:10.082 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onStop
2020-03-26 09:23:10.082 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onCreateView
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onActivityCreated
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onStart
2020-03-26 09:23:10.085 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onResume
2020-03-26 09:23:44.288 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onPause
2020-03-26 09:23:44.288 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onStop
2020-03-26 09:23:44.288 10631-10631/com.heima.mynewdemo E/HomeFragmentB====: onDestroyView
2020-03-26 09:23:44.290 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:23:44.291 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:23:44.291 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:23:44.291 10631-10631/com.heima.mynewdemo E/HomeFragmentA====: onResume
Summary: fragment that has been created will not be destroyed;
4, add, with the hide, show use
homeFragmentA = new HomeFragmentA();
homeFragmentB = new HomeFragmentB();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment, homeFragmentA)
.add(R.id.fragment, homeFragmentB)
.show(homeFragmentA)
.hide(homeFragmentB)
// .addToBackStack(null)
.commit();
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "添加A", Toast.LENGTH_SHORT).show();
getSupportFragmentManager().beginTransaction()
.show(homeFragmentA)
.hide(homeFragmentB)
// .addToBackStack(null)
.commit();
}
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "添加B", Toast.LENGTH_SHORT).show();
getSupportFragmentManager().beginTransaction()
.show(homeFragmentB)
.hide(homeFragmentA)
// .addToBackStack(null)
.commit();
}
});
}
Log is as follows:
2020-03-26 09:42:58.790 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onAttach
2020-03-26 09:42:58.790 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onCreate
2020-03-26 09:42:58.791 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onAttach
2020-03-26 09:42:58.791 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onCreate
2020-03-26 09:42:58.792 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onCreateView
2020-03-26 09:42:58.792 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onActivityCreated
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onCreateView
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onActivityCreated
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onStart
2020-03-26 09:42:58.793 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onStart
2020-03-26 09:42:58.795 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onResume
2020-03-26 09:42:58.795 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onResume
2020-03-26 09:43:05.875 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onPause
2020-03-26 09:43:05.875 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onPause
2020-03-26 09:43:06.315 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onStop
2020-03-26 09:43:06.316 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onStop
2020-03-26 09:43:06.317 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onDestroyView
2020-03-26 09:43:06.318 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onDestroy
2020-03-26 09:43:06.318 14718-14718/com.heima.mynewdemo E/HomeFragmentA====: onDetach
2020-03-26 09:43:06.319 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onDestroyView
2020-03-26 09:43:06.319 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onDestroy
2020-03-26 09:43:06.319 14718-14718/com.heima.mynewdemo E/HomeFragmentB====: onDetach
Third, the basic use of Fragment
1 Notes AndroidX in Fragment use, Activity must inherit AppCompatActivity, use getSupportFragmentManager ()
2 Notes Fragment used in Android, Activity must inherit Activity, use getFragmentManager ()
package com.heima.googledemo;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
public class MainActivity extends AppCompatActivity {
private ImageView image;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Android
getFragmentManager().beginTransaction()
.add(R.id.fragment_container, homeFragment)
.add(R.id.fragment_container, homeFragmentB)
.show(homeFragment)
.hide(homeFragmentB)
.addToBackStack(null)
.commit();
//AndroidX
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment, homeFragment)
.add(R.id.fragment, homeFragmentB)
.show(homeFragment)
.hide(homeFragmentB)
.addToBackStack(null)
.commit();
}
});
}
}
Four, Fragment communication with Activity
1, obtain the View Activity in the Fragment
View view = getActivity().findViewById(R.id.text)
2. Similarly, you can also use the Activity findFragmentById()
or findFragmentByTag()
from through FragmentManager
the acquisition of Fragment
method segment to call references. Or using the new object call method, for example:
ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager (). findFragmentById ( R . id .example_fragment );