Fragment的生命周期

    对于Fragment有了一些新的认识,分享出来给大家,一来回顾下以前的知识,而来与大家共同学习,如有不足之处请指出。

首先来认识下Fragment,翻译过来是碎片,片段的意思。是google 在API 11 也就是 3.0以后推出的新特性。


那么,Fragment的作用是什么,为什么要使用Fragment?

我们知道,现在的手机屏幕越来越大,平板手机等屏幕更不用说有多大的尺寸了。我们在3.0之前与用户交互的界面一直使用的是Activity,Activity对于界面之间的跳转确实很灵活,但是却不能多用,比如我们要实现这样一个界面,如果使用Activity之间的页面跳转到另一个Activity,会对使用效果有很大的影响,我们知道屏幕越大,像素数越多,渲染时间越长,很容易出现花屏等现象。因此我们采用Fragment就能很好的解决下面的问题,在Activity中植入Fragment,这样页面之间不需要跳转,直接在本页就可以展示的效果。

那么,下面开始代码进行案例演示吧。

首先在创建一个项目工程,注意下面创建的工程是兼容到2.3的。所以要导入V4包。

如果你创建的工程是3.0以后的就需要了,因为3.0以后的google已经封装到了系统源码了。

下面是Activity中的代码:

package com.google.fragment;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;
//注意,这里是继承的V4包下的FragmentActivity
public class MainActivity extends FragmentActivity {

	private MyFragment myFragment;
	private SecondFragment secondFragment;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		System.out.println("onCreate");
	}

	@Override
	protected void onStart() {
		super.onStart();
		System.out.println("onStart");
	}

	@Override
	protected void onRestart() {
		System.out.println("onRestart");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		System.out.println("onResume");
		super.onResume();
	}

	@Override
	protected void onPause() {
		System.out.println("onPause");
		super.onPause();
	}

	@Override
	protected void onStop() {
		super.onStop();
		System.out.println("onStop");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		System.out.println("onDestroy");
	}
	//第一个按钮的点击事件
	public void click(View view) {

		myFragment = new MyFragment();
		FragmentTransaction ft1 = getSupportFragmentManager().beginTransaction();//开启一个事物
		ft1.replace(R.id.container, myFragment);//替换当前的布局
		ft1.commit();//提交
	}
	//第二个按钮的点击事件
	public void clicked(View view) {
		secondFragment = new SecondFragment();

		FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction();
		ft2.replace(R.id.container, secondFragment);
		ft2.commit();
	}
}

看看我们的布局,是一个线性布局包裹了一个线性布局和帧布局。

<LinearLayout 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"
    android:orientation="horizontal"
    tools:context="com.google.fragment.MainActivity" >

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_first"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="click"
            android:text="坚持" />

        <Button
            android:id="@+id/btn_second"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="clicked"
            android:text="厚发" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:background="#5500ff00" >
    </FrameLayout>

</LinearLayout>

至于创建的Fragment的就更简单了,继续看Fragment的代码和布局

package com.google.fragment;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MyFragment extends Fragment {

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		System.out.println("MyFragment"+"onAttach");
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		System.out.println("MyFragment"+"onCreate");
		super.onCreate(savedInstanceState);
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		System.out.println("MyFragment"+"onCreateView");
		//注意我们在这里将Fragment中的布局进行一个初始化
		return inflater.inflate(R.layout.fragment_main, null);
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		System.out.println("MyFragment"+"onActivityCreated");
		super.onActivityCreated(savedInstanceState);
	}

	@Override
	public void onStart() {
		System.out.println("MyFragment"+"onStart");
		super.onStart();
	}
	

	@Override
	public void onResume() {
		System.out.println("MyFragment"+"onResume");
		super.onResume();
	}

	@Override
	public void onPause() {
		System.out.println("MyFragment"+"onPause");
		super.onPause();
	}

	@Override
	public void onStop() {
		System.out.println("MyFragment"+"onStop");
		super.onStop();
	}

	@Override
	public void onDestroyView() {
		System.out.println("MyFragment"+"onDestroyView");
		super.onDestroyView();
	}
	
	@Override
	public void onDestroy() {
		System.out.println("MyFragment"+"onDestroy");
		super.onDestroy();
	}
	
	@Override
	public void onDetach() {
		System.out.println("MyFragment"+"onDetach");
		super.onDetach();
	}

}

Fragment的布局

<?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:background="#5500ff00"
    android:orientation="vertical" >

    <TextView
        android:textSize="25dp"
        android:textColor="@android:color/black"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="天才在于积累,聪明出于勤奋" />

</LinearLayout>

最后重点来了,看下Fragment的生命周期,看到Fragment的生命周期与Activity的生命周期是不是很相似。那么我们看看开启Fragment之后会调用那几个方法?

首先是Activity启动后,再点击按钮跳转到Fragment页面中的生命周期执行方法

通过上面的图片我们可以看到,首先执行了Activity的三个方法,点击跳转之后又执行了Fragment的六个方法。至于每个方法的作用,有时间再补充。

接下来我们看下点击Home键的方法执行流程

首先执行的是Activity中的onPause()方法再执行的是Fragment中的onPause()和onStop(),最后执行Activity中的onStop();

下面再来看正常退出的生命周期流程:

同样是先走的是Activity中的失去焦点,再然后是Fragment中的,最后销毁。

下面我们再来看Fragment之间的跳转,生命周期流程:

可以看到,Fragment之间跳转并不会重走Activity中的生命周期,所以可以认为Fragment是一个轻量级的Activity。

现在,大家了解Fragment了吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值