Android_Fragment_Fragment具体解释
1.Fragment概述
在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity能够结合多个Fragment对象,也能够在多个activity中使用同样Fragment字节码相应的不同对象。一个Fragment对象必须被嵌入在一个主Activity对象中,该Fragment的生命周期与主Activity息息相关。比方,当主Activity处于paused状态,其相应的全部Fragment对象均处于paused状态,仅仅有当主Activity处于resumed状态时,Fragment才干处于自由控制状态。
2.创建Fragment
为了创建一个Fragment,应该去继承Fragment或者其子类,覆写对应的方法。比方onCreate(),OnCreateView(),onPause()等等
(1).加入UI界面
为该Fragment展现一个布局,必须去实现onCreateView()回掉方法。
注意:当该Fragment继承了ListFragment时,不须要覆写onCreateView()方法,由于默认返回一个ListView对象
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.list, null);
- return view;
- }
(2).加入Fragment到Activity
1).通过layout布局文件
android:name属性应该为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:orientation="horizontal" >
- <fragment
- android:id="@+id/list"
- android:name="com.example.news.ArticleListFragment"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1" />
- <fragment
- android:id="@+id/viewer"
- android:name="com.example.news.ArticleReaderFragment"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="2" />
- </LinearLayout>
2).通过Java代码
当Activity执行时,能够自由的在该activity上加入fragment对象,但应该指定一个ViewGroup容器,能够FragmentTransaction完毕fragment的加入移除或者替换。
- manager = getFragmentManager();
- if(manager.findFragmentByTag("right") == null){
- manager.beginTransaction().replace(R.id.right, new RightFrag(), "right").commit();
- }
(3).fragment唯一标示符
每一个fragment须要定义一个唯一的标识符,假设activity被销毁又又一次启动,系统可以恢复该fragment的状态。假设想又一次恢复,需满足以下有3种方式之中的一个:
1).定义ID
在布局文件里,定义android:id属性
- <fragment
- android:id="@+id/list"
- android:name="com.example.news.ArticleListFragment"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1" />
2).指明tag
android:tag 指明 或者 一个fragment对象add()或者replace()时指定tag
- <fragment
- android:id="@+id/list"
- android:tag="first"
- android:name="com.example.news.ArticleListFragment"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1" />
或者
- manager.beginTransaction()
- .replace(R.id.right, new RightFrag(), "right")//在事务中指明该fragment的tag
- .commit();
3).viewgroup ID
假设该fragment均没有id和tag,系统将使用container view布局的id
3.Fragment的管理
通过getFragmentManager()方法,能够得到FragmentManager对象,主要完毕以下的功能
- FragmentManager manager = getFragmentManager();
(1).得到已经存在Fragment对象
假设该fragment在布局文件里指定了id,通过findFragmentById()得到对象,或者指定了tag能够通过findFragmentByTag()得到对象
- Fragment fragment = getFragmentManager().findFragmentByTag("right");
- //or
- Fragment fragment = getFragmentManager().findFragmentById(id);
(2).注冊OnBackStackChangedListener监听器
能够用来监听该任务相应的返回栈信息,当该返回栈状态发生改变时,运行相应的onBackStackChanged() 方法
- manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
- @Override
- public void onBackStackChanged() {
- Toast.makeText(MainActivity.this, "返回堆状态发生改变", 1).show();
- }
- });
(3).弹出返回栈
模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用.beginTransaction().addToBackStack("right")加入了进返回栈
- manager.popBackStack(); //Pop the top state off the back stack
(4).FragmentTransaction事务
事务主要包括一些操作的集合,比方添加移除替换,动画设置等等
- /*
- * 通过manager开启一个事务,该事务包括一些操作的集合,通事务能够 add(), remove(), replace()
- * 完毕对Fragment的操作,并使用commit()提交
- */
- FragmentTransaction transaction = manager.beginTransaction();
- transaction.replace(R.id.right, new RightFrag(), "right");
- transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//设置动画
- transaction.addToBackStack("right"); // 将该fragment增加返回堆
- // 提交事务
- transaction.commit();
(5).Fragment状态管理
- /*
- * 管理Fragment的状态
- * 假设在一个主activityViewGroup中加入一个fragment,
- * 假设手机屏幕旋转了,当前activity被销毁重建,fragment也被activityManager创建
- * 故在onCreate中,须要推断一下
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- manager = getFragmentManager();
- if (manager.findFragmentByTag("right") == null) {
- // if(savedInstanceState == null)也可推断该fragment是否已经载入
- manager.beginTransaction()
- .replace(R.id.right, new RightFrag(), "right")
- .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置动画
- .addToBackStack("right") // 将该fragment增加返回堆
- // 提交事务
- .commit();
- }
- }
4.Fragment间信息交互
(1).取得对象
- /*
- * 点击该Fragment的button按钮,将该button的text设置为还有一个fragment中Edittext的文本值
- */
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.list, null);
- final Button button = (Button) view.findViewById(R.id.confirm);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //通过FragmentManager找到还有一个fragment中的edittext对象,并取得text内容
- EditText editText = (EditText)(getFragmentManager().findFragmentByTag("left").getView().findViewById(R.id.name));
- button.setText(editText.getText().toString());
- }
- });
- return view;
- }
(2).通回掉函数
- public class MainActivity extends Activity {
- private FragmentManager manager;
- private Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- RightFragment rightFrag = (RightFragment) (getFragmentManager().findFragmentByTag("right"));
- /*
- * 通过set方法,向其传递一个实例化对象,因为rightFrag.set()方法内部运行RightFragment.CallBack.get()方法,完毕了參数的传递
- */
- rightFrag.set(new RightFragment.CallBack() {
- @Override
- public void get(String str) {
- button.setText(str);
- }
- });
- }
- });
- }
- }
- public class RightFragment extends ListFragment {
- private LoaderManager manager;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- manager = getLoaderManager();
- }
- /*
- * 点击该Fragment的button按钮,将该button的text设置为还有一个fragment中Edittext的文本值
- */
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.list, null);
- return view;
- }
- /**
- * 通过调用该方法,接收一个回掉函数对象,callBack.get(str);
- * @param callBack
- */
- public void set(CallBack callBack) {
- EditText editText = (EditText) getView().findViewById(R.id.name);
- callBack.get(editText.getText().toString());
- }
- /*
- * 回掉接口
- */
- interface CallBack {
- public void get(String str);
- }
- }
5.Fragment的生命周期
(1).生命周期路线图
生命状态
周期过程
foreground lifetime
onResume(A)
onResume(F)
onPause(F)
onPause(A)
visible lifetime
onCreateView(F)
onActivityCreated(F)
onStart(A)
onStart(F)
onResume(A)
onResume(F)
onPause(F)
onPause(A)
onStop(F)
onStop(A)
onDestroyView(F)
entire lifetime
完整的生命周期
(2).生命周期回掉函数概述
方法 描写叙述 onAttach(Activity) 当前Fragment与Activity关联,调用!
onCreate() 完毕fragment的初始化创建
onCreateView() 创建并返回与当前fragment相关联的层次视图view
onActivityCreated() 主activity的onCreate()运行完后,该方法才运行
onStart() fragment可见,当主activity处于started状态后运行
onResume() fragment能与用户交互,当主activity处于resumed状态后运行
onPause() fragment不在与用户交互,可能在主activity将要处于paused前运行,可能该fragment被改动
onStop() fragment不在可见,可能在主activity将要处于stopped前运行,可能该fragment被改动
onDestroyView() 同意该fragment清理视图相关资源
onDestroy() 清理掉视图state信息
onDetach() 该fragment不在于activity关联
Android_Fragment_Fragment具体解释的更多相关文章
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- 说说BPM数据表和日志表中几个状态字段的详细解释
有个客户说需要根据这些字段的值作为判断条件做一些定制化需求,所以需要知道这些字段的名词解释,以及里面存储的值具体代表什么意思 我只好为你们整理奉上这些了! Open Work Sheet 0 Sav ...
- 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释
目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...
- nodejs、npm、grunt——名词解释
最近着手开发一个新项目,打算从工程化的角度整理一套自己的前端开发.发布体系. grunt这些工具,之前别人用我也用,并没有认真想过它们的前世今生,正好趁着这个机会,我来理一理目前业界比较流行这些工具的 ...
- HTTP各状态码解释
状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必 ...
- JavaScript中‘this’关键词的优雅解释
本文转载自:众成翻译 译者:MinweiShen 链接:http://www.zcfy.cc/article/901 原文:https://rainsoft.io/gentle-explanation ...
- XML简介与CDATA解释
简介XML 是一种受到广泛支持的 Internet 标准,用于以一种特殊的方式编码结构化数据.实际上,以 XML 编码的数据可以通过任何编程语言解码,人们甚至可以使用标准的文本编辑器来阅读或编写 XM ...
- free-简单明了解释清楚怎么看内存使用
free命令可以用来查看系统内存使用情况.我一般习惯-m参数以MB的方式查看 [root@localhost ~]# free -m total used free shared buffers ca ...
- .htaccess语法之RewriteCond与RewriteRule指令格式详细解释
htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签: htaccess it 分类: 网络 上文htacc ...
随机推荐
- LabView 下载与安装
labview2014是目前labview软件的最新版本,新版本增加了多个VI服务器对象,增加了多个vi脚本对象,增加了labview第三方许可和激活工具包,同时针对程序框图.编辑环境.应用程序生成器 ...
- HTML5-常见的事件- contextmenu 事件
主要控制应该何时显示上下文菜单,以便开发人员取消默认的上下文菜单而提供自定义的菜单 <1> 由于该事件是冒泡的,因此可以为document 指定一个事件处理程序,用以处理页面中发生的所有此 ...
- 数据库对于null值的处理
对于null值的处理,不同的数据库的处理函数是不同的,这里列举了部分数据库对于null的处理函数以及使用: Oracle:是用函数nvl(), ----nvl(chinese,0);如果语文成绩为nu ...
- elasticsearch,http://ip:9200访问不到的解决办法
现在解压elasticsearch之后,启动,通过http://localhost:9200可以访问的到,但是http://ip:9200访问不到,怎么办呢?带你解决,带你飞 修改elasticsea ...
- nginx+tomcat的集群和session复制
前端服务器采用nginx,后端应用服务器采用tomcat.nginx负责负载均衡,session复制在tomcat上处理. 1.nginx安装(略) 2.nginx配置负载均衡 http { incl ...
- Xcode6和Xcode5获取app名字
1.在Xcode5下,获取程序名字(app name)的方法为: NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionar ...
- sqlcommand循环内使用
using (SqlConnection conn = new SqlConnection()) { SqlCommand comm= new SqlCommand(); conn.Connectio ...
- Memcached内存管理模型分析
Memcached 是一个高性能的分布式内存对象缓存系统,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而减轻RDBMS的负担,提高服务的速度.提升可扩展性.本文将基于memcached1.4 ...
- jira汉化
https://translations.atlassian.com/dashboard/dashboard 下载汉化jar文件,在jira中上传插件,系统设置中文即可 LOFTER:我们的故事 ...
- javascript写的新闻滚动代码
在企业站中,我们会看到很多新闻列表很平滑的滚动,但是这种功能自己写太浪费时间,下面是我整理好的一组很常用的新闻列表滚动,有上下分页哦! 1.body里面 <div class="tz_ ...