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

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

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值