Fragment
来源:互联网 发布:snmpwalk用的什么端口 编辑:程序博客网 时间:2024/06/07 23:10
Android3.0(API 级别 11)开始引入Fragment的概念,有些书中将Fragment说为“碎片”,Android官网翻译的是“片段”。当然这不是重要的。关于Fragment的介绍官网是这样写的:
Fragment表示Activity中的行为或用户界面部分。您可以将多个片段组合在一个Activity中来构建多窗格UI以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除片段。
学习Fragment我们可以类比Activity:
①都是用来显示界面的;
②都是有生命周期的;(如下长图)
但是要注意Fragment必须依赖于Activity才能存活。
--------------------------------------------------------进入实际使用开始----------------------------------------------------------
如何在开发中使用片段(将片段添加到Activity返回栈时如何保持其状态、如何与Activity及Activity中的其他片段共享事件等)
您应该将每个片段都设计为可重复使用的模块化 Activity 组件。也就是说,由于每个片段都会通过各自的生命周期回调来定义其自己的布局和行为,您可以将一个片段加入多个 Activity,因此,您应该采用可复用式设计,避免直接从某个片段直接操纵另一个片段。
一、创建片段
创建Fragment的子类,重写方法onCreate()、onCreateView()、onPause()
二、添加用户界面
Fragment类似于Activity也是可以显示我们的UI布局的。
1.显示布局——实现onCreateView()方法,返回view 。
public class FragmentA extends Fragment{@Overridepublic View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savaedInstanceState){ return inflater.inflate(R.layout.fragment_a,container,false); }}
container:片段FragmentA将插入到父布局ViewGroup(Activity的布局);
savedInstanceState:在恢复片段时,提供上一个片段实例相关数据的Bundle;
inflate带有三个参数:
- 扩展的布局的资源 ID;
- 作为扩展布局父项的ViewGroup
- 指示是否应该在扩展期间将扩展布局附加至ViewGroup(第二个参数)的布尔值。(在本例中,其值为false,因为系统已经将扩展布局插入
container
— 传递 true 值会在最终布局中创建一个多余的视图组。)
三、向Activity中添加片段
两种方式加入片段:①在Activity布局文件中添加<fragment/>标签;②在代码中将片段添加到ViewGroup中
1.在Activity中添加片段
2.在代码中添加片段
①Activity中使用事务添加片段
FragmentManager manager = getFragmentManager();FragmentTransaction transaction = manager.begimTransaction();②使用add()方法,将目标片段添加到指定视图
FragmentA fragment = new FragmentA();transaction.add(R.id.ll_container,fragment);transaction.commit();add()方法第一个参数是ViewGroup,第二个参数是目标片段
四、管理片段
管理片段使用的正是上面代码中使用过的FragmentManager。从Activity中调用getFragmentManager()。
五、执行片段事务
在上面的代码中我们其实已经使用过了事务这一个API,现在来详细的介绍下什么是事务。
所谓事务就是应用程序中一系列严密的操作(比如添加Fragment、删除Fragment、替换Fragment等其他操作),所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。一个事务中的一系列的操作要么全部成功,要么一个都不做。
- 在Activity中使用事务
FragmentManager manager = getFragmentManager();FragmentTransaction transaction = manager.begimTransaction();使用add()、remove()、replace(),最后记得提交commit()
- 将每个事务保存到由 Activity 管理的返回栈内,从而让用户能够回退片段更改(类似于回退 Activity)
这一操作必须在commit之前,这样才可以将事务添加到片段事务返回栈中。该返回栈是由Activity管理,按住手机的返回按键就可以返回到上一个Fragment片段。
//新建一个FragmentB Fragment fragmentB = new FragmentB(); //开启事务 FragmentTransaction transaction = getFragmentManager().beginTransaction(); //替换之前的FragmentA transaction.replace(R.id.ll_fragment,fragmentB); //将事务保存到返回栈中 transaction.addToBackStack(null); //提交事务 transaction.commit();
fragmentB将会替换ll_fragment(ViewGroup)中的所有片段
六、与Activity通信
片段Fragment可以通过getActivity()访问Activity实例,执行在Activity布局中查找视图任务。
View lsitView = getActivity().findViewById(R.id.list);
同样也可以在Activity中使用findFragmentById()或findFragmentByTag(),通过FragmentManager获取对Fragment的引用来调用片段中的方法。
FragmentA fragment = (FragmentA)getFragmentManager().findFragmentById(R.id.fragment_a);
- Fragment
- Fragment
- fragment
- Fragment
- Fragment
- Fragment
- Fragment
- fragment
- fragment
- Fragment
- Fragment
- fragment
- Fragment
- Fragment
- Fragment
- Fragment
- Fragment
- fragment
- UVA-455 Periodic Strings
- Oracle中plsqlCase语句
- Dijkstra算法之最短路径
- Java 对象和类
- iOS 面试题--转自唐巧
- Fragment
- BorderContainer与ContentPane不能显示,解析不了
- 241. Different Ways to Add Parentheses
- spark学习日志<二>:条件控制与循环
- linux ar命令
- 几种指针的区别及用法
- 【数字图像处理】基于GDI的入门级YUV播放器设计
- HTML5中的video标签(无法显示画面)
- Qt实战开发-动态曲线图