之前有说到,Fragment的生命周期收宿主Activity生命周期的影响…
先来看一张图:
这便是Fragment的生命周期和回调方法,和宿主Activity生命周期的影响:
每一个Activity生命周期至少有一个Fragment的生命周期相对应。
现在来做一个实例:
接着上一个项目,通过Fragment中各个回调方法日志log打印出来。
新建两个Fragment类:MyFragment3和MyFragment4,两个内容是一样的,打印无非是区分一下。
MyFragment3:
package com.example.fragmenttest;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyFragment3 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
// 每次创建都会绘制Fragment的View组件回调
View view = inflater.inflate(R.layout.fragment2,container, false);
TextView tv=(TextView) view.findViewById(R.id.fg2_tv);
tv.setText("第一个Fragment");
Log.i("lpl", "Fragment1-onCreateView");
return view;
}
//当Fragment被添加到Activity中的时候会回调这个方法,只调用一次。
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
Log.i("lpl", "Fragment1-onAttach");
}
//创建Fragment的时候会回调,该方法只回调一次
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i("lpl", "Fragment1-onCreate");
}
// 当Fragment所在的Activity启动后调用
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
Log.i("lpl", "Fragment1-onActivityCreated");
}
// 启动Fragment
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i("lpl", "Fragment1-onStart");
}
// 恢复Fragment时会被回调,调用onstart方法后一定调用该方法
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i("lpl", "Fragment1-onResume");
}
// 暂停Fragment
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i("lpl", "Fragment1-onPause");
}
// 停止Fragment
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i("lpl", "Fragment1-onStop");
}
// 销毁Fragment所包含的View组件是调用
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
Log.i("lpl", "Fragment1-onDestroyView");
}
// 销毁Fragment时会被回调
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("lpl", "Fragment1-onDestroy");
}
// Fragment从Activity删除时会回调该方法,该方法只会被调用一次
@Override
public void onDetach() {
// TODO Auto-generated method stub
super.onDetach();
Log.i("lpl", "Fragment1-onDetach");
}
}
Fragment4就不再重复写了。
Fragment的布局文件fragment2.xml:
<?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" >
<TextView
android:id="@+id/fg2_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
跳转到另一个Activity进行碎片Fragment的添加:
Mainactivity3:
package com.example.fragmenttest;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Mainactivity3 extends Activity{
private boolean flag=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main3);
init();
Button bt=(Button) findViewById(R.id.main3_bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
if(flag){
MyFragment3 fragment=new MyFragment3();
beginTransaction.replace(R.id.main_layout, fragment);
flag=false;
}
else{
MyFragment4 fragment=new MyFragment4();
beginTransaction.replace(R.id.main_layout, fragment);
flag=true;
}
beginTransaction.commit();
}
});
}
private void init() {
// TODO Auto-generated method stub
MyFragment3 fragment=new MyFragment3();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.add(R.id.main_layout, fragment);
beginTransaction.commit();
}
}
通过按钮的点击可以切换Fragment。
它的布局文件main3.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/main3_bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换Fragment"
/>
</LinearLayout>
这里将LinearLayout进行了+id,一会碎片Fragment会加到这个布局中。
在对应的Mainactivity中生命周期那块继续添加代码:
package com.example.fragmenttest;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class MainActivity extends Activity {
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rg = (RadioGroup) findViewById(R.id.main_rg);
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
switch (checkedId) {
case R.id.main_bt:
Intent intent=new Intent();
intent.setClass(MainActivity.this, MainActivity2.class);
startActivity(intent);
break;
case R.id.main_bt1:
MyFragment2 fragment=new MyFragment2();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.add(R.id.main_ll, fragment);
beginTransaction.addToBackStack(null);
beginTransaction.commit();
break;
case R.id.main_bt2:
Intent intent1=new Intent();
intent1.setClass(MainActivity.this, Mainactivity3.class);
startActivity(intent1);
break;
case R.id.main_bt3:
break;
default:
break;
}
}
});
}
}
让Fragment做以下几个步骤:
启动Fragment——>屏幕锁屏——>屏幕解锁——>切换到第二个Fragment——>回到桌面——>回到应用——>退出
Fragment。
1、启动Fragment:
onAttach——>onCreate——>onCreateView——>onActivityCreate——>onStart——>onResume。
2、屏幕锁屏
onPause——>onStop。
3、屏幕解锁
onStart——>onResume。
4、切换到第二个Fragment:
第一个Fragment:onPause——>onStop——>onDestroyView——>onDestroy——>onDetach。
第二个Fragment:onAttach——>onCreate——> onCReatView——>onActivityCreate——>onStart——>onResume。
5、回到桌面
onPause——>onStop。
6、回到应用:
onStart——>onResume。
7、退出Fragment:
onPause——>onStop——>onDestroyView——>onDestroy——>onDetach。