作者:郭孝星
微博:郭孝星的新浪微博
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells
如果我们的App设计成要支持范围广泛的屏幕尺寸时,在可利用的屏幕空间内,我们可以通过在不同的布局配置中重用你的Fragment来优化我们的用户体验。一个手机设备可能适合一次只有一个Fragment的单面板用户交互。相反,在更大屏幕尺寸的平板电脑上,我们可能更想要两个Fragment并排在一起,用来向用户展示更多信息。
如下图所示:
Fragment是Activity模块化的一部分,它拥有自己的生命周期,接收自己的输入事件,可以在Activity运行中被添加和移除,也可以被多个Activity所复用。
一 Fragment的特性
总的说来,Fragment具备以下特性:
- Fragment总是作为Activity界面的组成部分,Fragment可调用getActivity()方法获取它所在的Activity;Activity可以通过FragmentManager的findFragmentById()方法或者findFragmentByTag()方法来获取相应的Fragment。
- 在Activity运行过程中,可以通过FragmentManager的add()、remove()和replace()方法来添加、删除或替换Fragment。
- 一个Activity可以同时使用多个Framework,同一个Fragment也可以被多个Activity所复用。
- Fragment可以响应自己的输入事件,并有自己的生命周期,但是Fragment的生命周期直接被它所属的Activity所控制。
二 Fragment的生命周期和回调方法
Fragment的生命周期
Fragment的生命周期如下图所示:
- 活动状态:当前Fragment位于前台,用户可见,可以获得焦点。
- 暂停状态:其他Activity位于前台,Fragment依然可见,只是不能获得焦点。
- 停止状态:Fragment不可见,失去焦点。
- 销毁状态:Fragment被完全删除,或者该Fragment所在的Activity被结束。
Fragment的回调方法
Fragment的回调方法如下图所示:
- onAttach():当Fragment被添加到Activity时被回调,该方法只会被调用一次。
- onCreate():系统创建Fragment对象后回调该方法,实现代码中只初始化需要在Fragment中保持的必要组件,当Fragment被暂停或者停止后可以恢复。该方法只会被调用一次。
- onCreateView():当Fragment绘制界面组件时会回调该方法,该方法返回一个View,这个View就是Fragment所显示的View。
- onActivityCreated():当Fragment所在的Activity启动完成后回调该方法。
- onResume():恢复Fragment时被回调,onStart()调用之后一定会调用onResume()方法。
- onPause():当用户离开该Fragment时会回调该方法。
- onDestory():销毁Fragment时被回调,该方法只会被调用一次。
- onDetach():将该Fragment从Activity中删除,被替换完成时会回调该方法,onDestory()方法调用后一定会回调onDetach()方法,该方法只会被调用一次。
下面我们通过一个例子来演示Fragment的生命周期和回调方法的调用过程。
主程序界面如下所示:
自定义的Fragment的各个回调方法都加入了打印来观察回调方法的变化情况,源码如下所示:
LifecycleFragment源码
package org.crazyit.app;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class LifecycleFragment extends Fragment
{
final String TAG = "LifecycleFragment";
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
// 输出日志
Log.d(TAG, "-------onAttach------");
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 输出日志
Log.d(TAG, "-------onCreate------");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle data)
{
// 输出日志
Log.d(TAG, "-------onCreateView------");
TextView tv = new TextView(getActivity());
tv.setGravity(Gravity.CENTER_HORIZONTAL);
tv.setText("测试Fragment");
tv.setTextSize(40);
return tv;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
// 输出日志
Log.d(TAG, "-------onActivityCreated------");
}
@Override
public void onStart()
{
super.onStart();
// 输出日志
Log.d(TAG, "-------onStart------");
}
@Override
public void onResume()
{
super.onResume();
// 输出日志
Log.d(TAG, "-------onResume------");
}
@Override
public void onPause()
{
super.onPause();
// 输出日志
Log.d(TAG, "-------onPause------");
}
@Override
public void onStop()
{
super.onStop();
// 输出日志
Log.d(TAG, "-------onStop------");
}
@Override
public void onDestroyView()
{
super.onDestroyView();
// 输出日志
Log.d(TAG, "-------onDestroyView------");
}
@Override
public void onDestroy()
{
super.onDestroy();
// 输出日志
Log.d(TAG, "-------onDestroy------");
}
@Override
public void onDetach()
{
super.onDetach();
// 输出日志
Log.d(TAG, "-------onDetach------");
}
}
第一次点击加载目标Fragment
进入应用后,我们首先点击加载目标Fragment,我们会发现Fragment会先onAttach()添加到当前Activity,创建完成后调用onResume(),函数调用链如下图所示:
第二次点击加载目标Fragment
当我们再次点击加载Fragment时,原来的Fragment会被销毁,新的Fragment会被创建,函数调用链如下所示:
点击启动对话框风格的Activity
当Fragment已经创建,我们再去点击启动对话框风格的Activity,对话框启动后,Activity处于Pause状态,那么从属于它的Fragment自然也会处于Pause状态,如下图所示:
当对话框退出后,Activity恢复,Fragment也随之恢复,如下图所示:
点击替换目标Fragment并加入Back栈
当我们点击替换目标Fragment并加入Back栈,此时Fragment虽然不可见,但是没有被销毁,它只是被添加到后台的Back栈,如下图所示:
当用户按下back键时,加入到Back栈的Fragment会再次显示出来,如下图所示:
点击退出
版权声明:本文为博主原创文章,未经博主允许不得转载。