总结:
1、add覆盖原fragment, 添加入一个新fragment后, 原来的fragment仍然存活
2、replace 是先remove掉相同id的所有fragment,然后在add当前的这个fragment
从性能出发, 推荐使用replace(有疑问,再研究下)
1、add、replace,不管是否添加addToBackStack,都要走一遍fragment 的周期;
2、FragmentA和FragmentB 进行切换 replace同一个fragment是不会走生命周期。
3、FragmentA和FragmentB 进行切换 replace不添加addToBackStack,每次都把当前的fragment进行销毁,然后添加新的fragment,走全部的生命周期。
4、FragmentA和FragmentB 进行切换 replace添加addToBackStack,不会销毁当前的fragment。
一、生命周期
二、add、replace、show、hide方法的区别
add方法的调用
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment, homeFragmentA)
.commit();
replace方法的调用
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment, homeFragmentA)
.commit();
add、replace,不管是否添加addToBackStack,日志都是如下:
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对homeFragmentA、homeFragmentB进行切换:
1、replace同一个fragment是不会走生命周期。
2、使用replace进行切换
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();
}
});
}
日志如下:
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
总结:每次都把当前的fragment进行销毁,然后添加新的fragment,走全部的生命周期:
3、 加入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();
}
});
}
日志如下:
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
总结: 已经创建的fragment不会销毁;
4、使用add、配合hide、show使用
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();
}
});
}
日志如下:
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
三、Fragment的基本使用
1、AndroidX中Fragment使用的注意事项,Activity 必须继承AppCompatActivity,使用getSupportFragmentManager()
2、Android中Fragment使用的注意事项,Activity 必须继承Activity,使用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();
}
});
}
}
四、Fragment与Activity 通信
1、在Fragment获取Activity中的View
View view = getActivity().findViewById(R.id.text)
2、同样,您的Activity也可使用findFragmentById()
或findFragmentByTag()
,通过从FragmentManager
获取对Fragment
的引用来调用片段中的方法。或者使用new 的对象进行方法的调用,例如:
ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager (). findFragmentById ( R . id .example_fragment );