一直想好好研究一下项目中常常用到的Fragment。这篇先记录一下对Fragment的回退栈的学习。 @[toc]java
Fragment是Android3.0以后引入的可嵌入activity中的碎片化组件,实现了界面的最大化利用。有如下几个特色:android
(1)不可独立存在,可是有本身的生命周期。不过由于与activity关联在一块儿,生命周期会受activity影响。app
(2) 可静态引入也可动态加载。推荐使用support-v4中的android.support.v4.app.Fragment而非系统内置的android.app.Fragment。因前者能让Fragment在全部Android系统版本中保持功能一致性。ide
onAttach()布局
Fragment和Activity创建关联的时候调用(得到activity的传递的值)学习
onCreateView()this
为Fragment建立视图(加载布局)时调用(给当前的fragment绘制UI布局)spa
onActivityCreated()code
当Activity中的onCreate方法执行完后调用(表示activity执行oncreate方法完成了的时候会调用此方法)cdn
onDestroyView()
Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局)
onDetach()
Fragment和Activity解除关联的时候调用(脱离activity)
当一个fragment第一次被加载到屏幕上的时候,会依次执行:
onAttach()
onCreate()
onCreateView()
onActivityCreated()
接着,当这个fragment对用户可见的时候,会依次执行:
onStart()
onResume()
这个时候,若是该fragment进入了中止状态(“进入后台模式”),会依次执行:
onPause()
onStop()
若这个fragment被销毁了(或者和ta关联的activity被销毁了),在执行了上面两个方法以后紧跟着会执行:
onDestroyView()
onDestroy()
onDetach()
此时该fragment被销毁而且与activity解除了关联。
onCreateView()
onActivityCreated()
onStart()
onResume()
由于没有被销毁,因此onCreate()不会被调用。
额那什么状况下fragment没有被销毁呢?这就和fragment的回退栈有关啦~
咱们知道Activity是以栈的方式进行管理的,Fragment也有相似的方式。
Fragment的回退栈---是用来保存每一次Fragment事务发生的变化 若是你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment彻底从后退栈中弹出,用户再次点击后退键,则退出当前Activity。
首先咱们先认识下这个方法:FragmentTransaction.addToBackStack(String)【把当前事务的变化状况添加到回退栈,通常传入null便可】
接下来咱们用一个例子来证实一下其起到的做用以及生命周期是否真的有所不一样。
MainActivity的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/id_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</RelativeLayout>
复制代码
MainActivity.java文件
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, new FragmentOne(),"ONE");
tx.commit();
}
}
复制代码
FragmentOne.class文件
public class FragmentOne extends Fragment implements OnClickListener {
private Button mBtn;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
mBtn = (Button) view.findViewById(R.id.bn_fragment_one);
mBtn.setOnClickListener(this);
Log.e("onCreateView", "one");
return view;
}
@Override
public void onClick(View v) {
FragmentTwo fTwo = new FragmentTwo();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.replace(R.id.id_content, fTwo, "TWO");
tx.addToBackStack(null);
tx.commit();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.e("onAttach", "one");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("onCreate", "one");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e("onActivityCreated", "one");
}
@Override
public void onStart() {
super.onStart();
Log.e("onStart", "one");
}
@Override
public void onResume() {
super.onResume();
Log.e("onResume", "one");
}
@Override
public void onPause() {
super.onPause();
Log.e("onPause", "one");
}
@Override
public void onStop() {
super.onStop();
Log.e("onStop", "one");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("onDestroy", "one");
}
@Override
public void onDetach() {
super.onDetach();
Log.e("onDetach", "one");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e("onDestroyView", "one");
}
复制代码
FragmentTwo.class文件
public class FragmentTwo extends Fragment implements OnClickListener {
private Button mBtn ;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_two, container, false);
mBtn = (Button) view.findViewById(R.id.bn_fragment_two);
mBtn.setOnClickListener(this);
Log.e("onCreateView", "two");
return view ;
}
@Override
public void onClick(View v) {
FragmentThree fThree = new FragmentThree();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.hide(this);
tx.add(R.id.id_content , fThree, "THREE");
//tx.replace(R.id.id_content, fThree, "THREE");
tx.addToBackStack(null);
tx.commit();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.e("onAttach", "two");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("onCreate", "two");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e("onActivityCreated", "two");
}
@Override
public void onStart() {
super.onStart();
Log.e("onStart", "two");
}
@Override
public void onResume() {
super.onResume();
Log.e("onResume", "two");
}
@Override
public void onPause() {
super.onPause();
Log.e("onPause", "two");
}
@Override
public void onStop() {
super.onStop();
Log.e("onStop", "two");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("onDestroy", "two");
}
@Override
public void onDetach() {
super.onDetach();
Log.e("onDetach", "two");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e("onDestroyView", "two");
}
复制代码
FragmentThree.class文件
public class FragmentThree extends Fragment implements OnClickListener {
private Button mBtn;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_three, container, false);
mBtn = (Button) view.findViewById(R.id.bn_fragment_three);
mBtn.setOnClickListener(this);
Log.e("onCreateView", "three");
return view;
}
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), " i am a btn in Fragment three",
Toast.LENGTH_SHORT).show();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.e("onAttach", "three");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("onCreate", "three");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e("onActivityCreated", "three");
}
@Override
public void onStart() {
super.onStart();
Log.e("onStart", "three");
}
@Override
public void onResume() {
super.onResume();
Log.e("onResume", "three");
}
@Override
public void onPause() {
super.onPause();
Log.e("onPause", "three");
}
@Override
public void onStop() {
super.onStop();
Log.e("onStop", "three");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("onDestroy", "three");
}
@Override
public void onDetach() {
super.onDetach();
Log.e("onDetach", "three");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e("onDestroyView", "three");
}
复制代码
R.layout.fragment_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">
<EditText
android:id="@+id/et_fragment_one"
android:layout_width="match_parent"
android:text="myself"
android:layout_height="wrap_content" />
<Button
android:id="@+id/bn_fragment_one"
android:layout_width="wrap_content"
android:text="Button in one"
android:layout_height="wrap_content" />
</LinearLayout>
复制代码
这个过程当中所调用的回调方法,Log打印以下:
@Override
public void onClick(View v) {
FragmentTwo fTwo = new FragmentTwo();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.replace(R.id.id_content, fTwo, "TWO");
tx.addToBackStack(null);
tx.commit();
}
复制代码
此时FragmentOne被替换【replace】,添加到回退栈中【addToBackStack】,onPause(),onStop(),onDestroyView()被调用,可是onDestroy(),onDetach()就没被调用,该Fragment实例被保存了下来。Log:
@Override
public void onClick(View v) {
FragmentThree fThree = new FragmentThree();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.hide(this);
tx.add(R.id.id_content , fThree, "THREE");
//tx.replace(R.id.id_content, fThree, "THREE");
tx.addToBackStack(null);
tx.commit();
}
复制代码
调用的是hide(),而非replace()
hide(),show():调用了Fragment建立及到前台的几个回调方法后,该Fragment在后台或者从新回到前台的时候,不会调用到相关生命周期回调方法,因此视图不会重绘
replace():至关于remove和add的合体,视图重绘
一、replace,加回退栈 --- Fragment不销毁,可是切换时会销毁视图和从新建立视图
二、replace, 不加回退栈 --- Fragment销毁
三、hide、show --- Fragment不销毁,也不销毁视图。隐藏和显示不走生命周期
未完待续~毕竟Fragment还有不少要学的东西
而后仍是那句老话,但愿各位看官不吝赐教~蟹蟹啦