博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fragment学习(一) :生命周期
阅读量:5139 次
发布时间:2019-06-13

本文共 6238 字,大约阅读时间需要 20 分钟。

一、 何为Fragment

Fragment是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity中重用一个Fragment。你可以把Fragment认为模块化的一段Activity,它具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除。

Fragment不能独立存在,它必须嵌入到Activity中,而且Fragment的生命周期直接受所在的Activity的影响。例如:当Activity暂停时,它拥有的所有的Fragment们都暂停了,当Activity销毁时,它拥有的所有Fragment们都被销毁。

然而,当Activity运行时(在onResume()之后,onPause()之前),你可以单独地操作每个Fragment,比如添加或删除它们。当你在执行上述针对Fragment的事务时,你可以将事务添加到一个棧中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。

当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。你可以在layoutxml文件中声明Fragment,元素为:<fragment>;也可以在代码中创建Fragment,然后把它加入到ViewGroup控件中。然而,Fragment不一定非要放在Activity的界面中,它可以隐藏在后台为Activity工作。

说道这里,你可能还无法理解,那我们举个官网上的例子说明下:

写一个读新闻的程序,可以用一个Fragment显示标题列表,另一个Fragment显示选中标题的内容,这两个Fragment都在一个Activity上,并排显示。那么这两个Fragment都有自己的生命周期并响应自己感兴趣的事件。

于是,不需再像手机上那样用一个Activity显示标题列表,用另一个Activity显示新闻内容;现在可以把两者放在一个Activity上同时显示出来。

二、 Fragment的生命周期

接下来,我们通过一个实例来更好的理解Fragment。

定义一个Fragment,并覆盖其中的11个回调方法:

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的Activity(
Fragment是activity的界面中的一部分,它必须依附于Activity存在)的定义如下:

import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class FragmentLifecycle extends Activity{    Button startActivity, addFragment, backFragment, replaceFragment, finish;    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        startActivity = (Button) findViewById(R.id.startActivity);        addFragment = (Button) findViewById(R.id.addFragment);        backFragment = (Button) findViewById(R.id.backFragment);        replaceFragment = (Button) findViewById(R.id.replaceFragment);        finish = (Button) findViewById(R.id.finish);        // 为startActivity按钮绑定事件监听器        startActivity.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                Intent intent = new Intent(FragmentLifecycle.this, SecondActivity.class);                startActivity(intent);            }        });        // 为addFragment按钮绑定事件监听器        addFragment.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                LifecycleFragment fragment = new LifecycleFragment();                getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();            }        });        // 为backFragment按钮绑定事件监听器        backFragment.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                SecondFragment fragment = new SecondFragment();                getFragmentManager().beginTransaction().replace(R.id.container, fragment).addToBackStack("aa")// 将替换前的Fragment添加到Back栈                .commit();            }        });        // 为replaceFragment按钮绑定事件监听器        replaceFragment.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View v)            {                SecondFragment fragment = new SecondFragment();                getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();            }        });        // 为finish按钮绑定事件监听器        finish.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                // 结束该Activity                FragmentLifecycle.this.finish();            }        });    }}

下面,我们测试Fragment的生命周期:

1. 点击“加载目标Fragment”,查看日志输出

可以看到,Fragment加载后,经过onResume方法后,变为运行可见的状态。

2. 单击“启动对话框风格的Activity”。

启动对话框风格的Activity时,原先的Activity进入onPause()状态,而它管理的Fragment同样进入OnPause状态。

3. 关闭对话框风格的Activity

可见,当对话框关闭后,Fragment又变为运行状态。

4. 单击“替换目标Fragment、并加入Back栈”

替换目标Fragment、并加入Back栈中,此时该Fragment虽然不可见,但它并未被销毁。当用户按下返回键,该Fragment将再次显示出来。

5. 单击退出按钮,结束Fragment

退出Activity后,Fragment同样被销毁。

转载于:https://www.cnblogs.com/hehe520/p/6330023.html

你可能感兴趣的文章
Tomcat几种出错方法
查看>>
常用的adb命令
查看>>
Mycat 配置文件schema.xml
查看>>
【排序】绝境求生
查看>>
观察者模式(Observer Pattern)
查看>>
[深度学习]开源的深度学习框架
查看>>
算法图解笔记
查看>>
HashMap源码解析
查看>>
DVWA笔记之三:CSRF
查看>>
Dockerfile分享之SSH Server
查看>>
Linq to SQlite的使用
查看>>
HDU 1069 [Monkey and Banana] 动态规划
查看>>
使用Redshift渲染器,怎么选电脑配置!
查看>>
vue-element:文件上传七牛之key和异步的问题
查看>>
【BZOJ2631】tree (LCT)
查看>>
python常用代码笔记
查看>>
机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者...
查看>>
AJAX 跨源 HTTP 请求
查看>>
Web 项目系列之浏览器机制(一)
查看>>
IOS真机调试
查看>>