标签:
作者:郭孝星
微博:郭孝星的新浪微博
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells
如果我们的App设计成要支持范围广泛的屏幕尺寸时,在可利用的屏幕空间内,我们可以通过在不同的布局配置中重用你的Fragment来优化我们的用户体验。一个手机设备可能适合一次只有一个Fragment的单面板用户交互。相反,在更大屏幕尺寸的平板电脑上,我们可能更想要两个Fragment并排在一起,用来向用户展示更多信息。
如下图所示:
Fragment是Activity模块化的一部分,它拥有自己的生命周期,接收自己的输入事件,可以在Activity运行中被添加和移除,也可以被多个Activity所复用。
总的说来,Fragment具备以下特性:
Fragment的生命周期如下图所示:
Fragment的回调方法如下图所示:
下面我们通过一个例子来演示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会先onAttach()添加到当前Activity,创建完成后调用onResume(),函数调用链如下图所示:
当我们再次点击加载Fragment时,原来的Fragment会被销毁,新的Fragment会被创建,函数调用链如下所示:
当Fragment已经创建,我们再去点击启动对话框风格的Activity,对话框启动后,Activity处于Pause状态,那么从属于它的Fragment自然也会处于Pause状态,如下图所示:
当对话框退出后,Activity恢复,Fragment也随之恢复,如下图所示:
当我们点击替换目标Fragment并加入Back栈,此时Fragment虽然不可见,但是没有被销毁,它只是被添加到后台的Back栈,如下图所示:
当用户按下back键时,加入到Back栈的Fragment会再次显示出来,如下图所示:
版权声明:本文为博主原创文章,未经博主允许不得转载。
【Android应用开发技术:应用组件】Fragment基本原理
标签:
原文地址:http://blog.csdn.net/allenwells/article/details/47129085