您的位置:首页 > 其它

Fragment的生命周期

2016-05-14 17:54 393 查看
    对于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了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Fragment 生命周期