Android——Fragment的生命周期及其回掉方法...

来源:互联网 发布:spark 推荐算法 编辑:程序博客网 时间:2024/06/05 02:22

之前有说到,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。

这里写图片描述

0 1