Frament的生命周期和Activity的生命周期相似,只是多了几个步骤,总体流程相似,理解了Activity的生命周期,Frament 的生命周期就非常好理解
/**
* Fragment 碎片
* View 容器,从xml加载出,重用
* 有生命周期,小的activity,以来activity,
* onAttach()---当绑定的时候
* onCreate()---创建,接受Activity传输的数据
* onCreateView()---创建视图,加载layout文件,初始化组件
* onActivityCreated()---activity创建成功,方法已过时
*
* onStart()---启动
* onResume()
* onPause()
* onStop()
*
* onDestroy()
* onDestroyView()---销毁视图
* onDetach()---解绑
*
* 当activity启动的时候
* main--->onCreate
* Fragment--->onAttach--->onCreate--->onCreateView--->onActivityCreated
* --->onStart
* main--->onStart--->onResume
* Fragment--->onResume
*
* 当点击home键
* fragment-->
*
*
* 切换fragment
* 显示-->隐藏;onPause--onStop--onDestroyView--onDestroy--onDetach
* 隐藏-->显示:onAttach--onCreate--onCreateView--onActivityCreated--onStart--onResume
*
* 当加入backStack的时候
* 显示的fragment隐藏:onPause--onStop--onDestroyView
* 隐藏的fragment显示:onCreateView--onActivityCreated--onStart--onResume
*
*
*/
理解Frament的生命周期后,对于Frament的使用也是一个难点
1、Frament的转换
采用Android Studio的集成开发环境快速创建一个Frament
自行创建一个Frament类继承自Fragment
public class FirstFragement extends Fragment {
public static String FIST_ONE="str";
private String str;
private View rootview;
//创建
public static FirstFragement Instance(String str){
FirstFragement firstFragement=new FirstFragement();
Bundle bundle=new Bundle();
bundle.putString(FIST_ONE,str);
firstFragement.setArguments(bundle);
return firstFragement;
}
//onCreateView()当创建视图时
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(rootview==null){
// rootview=inflater.inflate(R.layout.fragment_first,container);//静态创建时
rootview=inflater.inflate(R.layout.fragment_first,container,false);//动态创建时
}
TextView textView=rootview.findViewById(R.id.TVtest);
textView.setText(str);
return rootview;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//接收数据
Bundle bundle=getArguments();
if (bundle!=null){
str=bundle.getString(FIST_ONE);
}
}
对应的XML文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/TVtest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试文本"
/>
</LinearLayout>
在Activity中去启动不同的Fragment
public class MainActivity extends AppCompatActivity {
boolean isFar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.switchBut);
button.setOnClickListener(new View.OnClickListener() {//根据点击启动不同的Fragment
Fragment fragment;
@Override
public void onClick(View view) {
if (isFar){
fragment=new ItemFragment();
}else {
fragment=new FirstFragement();
Bundle bundle=new Bundle();
bundle.putString(FirstFragement.FIST_ONE,"Hello Hi");
fragment.setArguments(bundle);//传输数据
}
switchView(fragment);
isFar=!isFar;
}
});
}
public void switchView(Fragment fragment){//根据传入的参数,启动不同的Fragment
//动态创建fragment,添加
// FirstFragement firstFragement=new FirstFragement();
// FragmentManager fragmentManager=getFragmentManager();//android.app的
//创建FragmentTransaction
// FragmentManager fragmentManager=getSupportFragmentManager();
// FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();//
FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();//上面两步可合成为此一步
// fragmentTransaction.add(R.id.contentFarg,fragment);//添加,同样的会叠加,因为用的是FrameLayout布局格式,新的界面会覆盖之前的界面
fragmentTransaction.replace(R.id.contentFarg,fragment);//替换,不会使届面发生叠加
// fragmentTransaction.remove();//
fragmentTransaction.addToBackStack("back");//返回栈,名字随意,返回键可以返回上一层
fragmentTransaction.commit();//提交,必须的流程
}
}
activity对应的XML文件
<Button
android:id="@+id/switchBut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
android:id="@+id/contentFarg"
/>