Android Fragment

2023-11-11

Android实习札记(4)---Fragment(碎片)基本概念解析

转载请注明出处:coder-pig

Fragment相信大家都不会陌生吧,侧滑啦,抽屉效果啦,DialogFragment啊等等,一堆地方都会

用到Fragment,对于Fragment的基本概念在前面的文章中其实已经给出的了,这里回顾一遍,

温故而知新嘛,同时结合Google官方的api进行复习!

 

1)什么是Fragment以及它的生命周期:

 

 

核心要点:

1)3.0版本后引入,即minSdk要大于11

2)Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套

的Fragment也是需要嵌套在Activity中的,间接地说,Fragment还是需要嵌套在Activity中!!受寄主

Activity的生命周期影响,当然他也有自己的生命周期!另外不建议在Fragment里面嵌套Fragment

因为嵌套在里面的Fragment生命周期不可控!!!

3)官方文档说创建Fragment时至少需要实现三个方法:onCreate( ),onCreateView( ),OnPause( );

不过貌似只写一个onCreateView也是可以的...

4)Fragment的生命周期和Activity有点类似:三种状态:

Resumed:在允许中的Fragment可见         Paused:所在Activity可见,但是得不到焦点

Stoped:

①调用addToBackStack(),Fragment被添加到Bcak栈

②该Activity转向后台,或者该Fragment被替换/删除

 

ps:停止状态的fragment仍然活着(所有状态和成员信息被系统保持着),然而,它对用户

不再可见,并且如果activity被干掉,他也会被干掉.

 

5)Fragment的子类有:

 

对话框:DialogFragment      列表:ListFragment     

选项设置:PreferenceFragment       WebView界面:WebViewFragment

 

 

 

 

 

2)如何去创建一个Fragment?

 

①静态添加Fragment

 

step 1:定义Fragment的布局,就是fragment显示内容的

step 2:自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法

在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. public class Fragmentone extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.             Bundle savedInstanceState) {  
  5.         View view = inflater.inflate(R.layout.fragment1, container,false);  
  6.         return view;  
  7.     }     
  8. }  

 

 

参数依次是:要加载的fragment布局;加载的fragment所在的父ViewGroup;而第三个参数则是:

是否将父ViewGroup添加到布局文件的根视图上,但是这样可能会产生一个多余的ViewGroup

对象;这里不理解的话就算了,写false就可以了

另外inflate方法还有其他的形式,一种典型的就是直接inflate(要显示布局,null),

如果使用这种的话:item布局中的根视图的layout_XX属性会被忽略掉,然后设置成默认的包裹

内容方式,所以还是建议使用三个参数的inflate()吧!详细缘由可参考:

http://www.2cto.com/kf/201407/313054.html

 

 

step 3:在需要加载Fragment的Activity对应的布局文件中添加fragment的标签,

记住,name属性是全限定类名哦,就是要包含Fragment的包名,如:

 

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. <fragment  
  2.     android:id="@+id/fragment1"  
  3.     android:name="com.jay.example.fragmentdemo.Fragmentone"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="0dp"  
  6.     android:layout_weight="1" />  

step 4:Activity在onCreate( )方法中调用setContentView()加载布局文件即可!

 

 

 

 

 

②动态添加Fragment

 

step 1:调用getFragmentManager获得FragmentManager对象fm

step 2.fm调用beginTransaction( )方法获得Fragment事务对象bt

step 3:bt调用add( )添加或者relpace( )替换Fragment,参数都是一样的

           第一个参数是要传入的容器,第二个参数是Fragment对象

step 4:最后还需要调用bt.commit( )提交事务,除了add和replace方法外

           还有个remove移除Fragment的方法,同样也是需要commit的!

局部代码:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. Fragment1 f1 = new Fragment1();  
  2. getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f1).commit();  

 

ps:这里的代码是app包下的使用fragment,所以导入的与Fragment有关的包都要是app哦!!!

另外为了低版本兼容也可以用v4包,改点东西而已,详细解析请见:

Fragment用app包还是v4包详解

 

 

 

 

 

 

 

 

3)Fragment与Activity的交互

①组件获取:

Fragment获得Activity中的组件:    

getActivity().findViewById(R.id.list)

Activity获得Fragment中的组件(根据id和tag都可以):        

getFragmentManager.findFragmentByid(R.id.fragment1);           

 

 

②数据传递

 

1.Activit传递数据给Fragment:      

在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle)

从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得

Bundle对象,然后进行解析就可以了

 

 

2.Fragment传递数据给Activity

在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,

Fragment就可以通过回调接口传数据了,回调,相信很多人都知道是什么玩意,但是

写不出来啊,网上的一百度"fragment传数据给Activity",全是李刚老师的那个代码,真心无语

算了,这里就写下局部代码吧,相信读者一看就懂的了:

 

step 1:定义一个回调接口:(Fragment中)

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. /*接口*/    
  2.    public interface CallBack{    
  3.        /*定义一个获取信息的方法*/    
  4.        public void getResult(String result);    
  5.    }    


step 2:接口回调(fragment中)

 

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. /*接口回调*/    
  2.     public void getData(CallBack callBack){    
  3.         /*获取文本框的信息,当然你也可以传其他类型的参数,看需求咯*/    
  4.         String msg = editText.getText().toString();    
  5.         callBack.getResult(msg);    
  6.     }    


step 3:使用接口回调方法读数据(Activity中)

 

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. /* 使用接口回调的方法获取数据 */    
  2. leftFragment.getData(new CallBack() {    
  3.  @Override    
  4.        public void getResult(String result) {              /*打印信息*/    
  5.             Toast.makeText(MainActivity.this, "-->>" + result, 1).show();    
  6.             }  
  7.         });    



总结来说,就是

->在Fragment定义一个接口,接口中定义抽象方法,你要传什么类型的数据

参数就设置为什么类型;

->接着还有写一个调用接口中的抽象方法,把要传递的数据传过去

->再接着就是Activity了,调用Fragment提供的那个方法,然后重写抽象方法的时候进行数据

的读取就可以了!!!

 

 

3.Fragment与Fragment传数据

 

其实这很简单,找到要接受数据的fragment对象,直接调用setArguments传数据进去就可以了

通常的话是replace时,即fragment跳转的时候传数据的,那么只需要在初始化要跳转的Fragment

后调用他的setArguments方法传入数据即可!

大概代码如下:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. FragmentManager fManager = getSupportFragmentManager( );  
  2. FragmentTransaction fTransaction = fManager.beginTransaction();  
  3. Fragmentthree t1 = new Fragmentthree();  
  4. Fragmenttwo t2 = new Fragmenttwo();  
  5. Bundle bundle = new Bundle();  
  6. bundle.putString("key",id);  
  7. t2.setArguments(bundle);   
  8. fTransaction.add(R.id.fragmentRoot, t2, "~~~");    
  9. fTransaction.addToBackStack(t1);    
  10. fTransaction.commit();    



 

如果是两个Fragment需要即时传数据,而非跳转的话,就需要先在Activity获得f1传过来的数据,再传

到f2了

 

 

 

 

4)Fragment管理与Fragment事务:

①管理:

Activity管理Fragment主要依靠FragmentManager可以调用findFragmentById( )获取指定的fragment

也可以调用popBackStack( )方法弹出后台Fragment;也可以调用addToBackStack(null)加入栈

或者监听后台栈的变化:addOnBackStackChangeListener

 

 

②事务

如果是增删替换Fragment的话,则需要借助FragmentTransaction对象;

同时执行Fragment的操作后,记得操作完后再使用commit( )方法提交事务哦!

 

 

 

5)最后说几句:

相信上面的生命周期图一时半会你也是记不住的,最后就初略地讲下大概流程吧:

①Activity加载Fragment的时候,依次调用下面的方法:

onAttach ->  onCreate -> onCreateView -> onActivityCreated -> onStart ->onResume;

②当我们弄出一个悬浮的对话框风格的Activity,或者其他,就是让Fragment所在的Activity可见,但不获得焦点

onPause

③当对话框关闭,Activity又获得了焦点:

onResume

④当我们替换Fragment,并调用addToBackStack()将他添加到Back栈中

onPause -> onStop -> onDestoryView

注意,此时的Fragment还没有被销毁哦!!!

⑤当我们按下键盘的回退键,Fragment会再次显示出来:

onCreateView -> onActivityCreated -> onStart -> onResume;

⑥如果我们替换后,在事务commit之前没有调用addToBackStack()方法将

Fragment添加到back栈中的话;又或者退出了Activity的话,那么Fragment将会被完全结束,

Fragment会进入销毁状态

onPause -> onStop -> onDestoryView -> onDestory -> onDetach

 

http://blog.csdn.net/coder_pig/article/details/41075031

转载于:https://www.cnblogs.com/poorfish/p/4190662.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Fragment 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • IntelliJ IDEA 2020版 修改 idea64.exe.vmoptions文件位置

    IntelliJ IDEA 2020版 修改 idea64 exe vmoptions文件位置 IDEA文件新的改变 2021 8 10 针对IntelliJ IDEA 2020 2 x64版本 亲验有效 idea64 exe vmopti
  • AcEdJig类

    以多段线类举例 class AsdkPolyLineJig public AcEdJig public AsdkPolyLineJig constAcGePoint3d po AsdkPolyLineJig voiddoIt 操作画图的主流
  • mysql在Windows下使用mysqldump命令手动备份数据库和自动备份数据库

    手动备份 cmd控制台 先进入mysql所在的bin目录下 如 cd C Program Files MySQL MySQL Server 5 5 bin mysqldump u root p 数据库 表名1 表名2 gt 文件路径 比如
  • 个人理财 第七章 理财师的工作流程和方法 8.33%

    第七章 理财师的工作流程和方法
  • 堆排序与新元素插入(对应王道考研数据结构)

    文章目录 代码 主要针对王道的代码增加了新元素的插入 上浮 操作 测试1 对大 小 根堆插入 上浮 一个新元素 时间复杂度与树的高度h有关 根据完全二叉树的性质 O l o g 2
  • 16_C#正则表达式之06将邮箱中的名字替换成星号

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Sys
  • gscale

    一 处理可变数量的输入和输出 利用nargin和nargout进行检测 T testhv 4 5 该函数体中使用nargin返回2 使用nargout返回1 函数nargchk可用于一个M函数体中 以检测传递函数的参量数目是否正确 msg
  • Linux脚本调试

    输出脚本运行每行的命令及状态 bash x 脚本名 或在脚本开头加上 bin bash x 仅对脚本中部分内容调试 set x set x bash 脚本名 运行脚本前先打印脚本 bash v 脚本名 或在脚本开头加上 bin bash v
  • String类

    String类 String 类的特点 字符串一旦初始化就不会被改变 1 获取 1 1 获取字符串中字符的个数 长度 int length 1 2 根据位置获取字符 char charAt int index 1 3 根据字符 串 获取在字
  • django返回html标签

    记录一下 使用from django utils html import format html return format html 例子 from django contrib import admin from models impo
  • python 多版本虚拟环境的安装以及常见报错的处理(解决python2.7 - pip wheel failed with error code 2 问题)

    安装 虚拟环境 注意虚拟环境的 包安装 不要加sudo sudo会装在全局 注意虚拟环境的 包安装 不要加sudo sudo会装在全局 注意虚拟环境的 包安装 不要加sudo sudo会装在全局 1 虚拟环境的创建和使用 项目1 gt 依赖
  • 【vscode】快捷键一键生成vue模板

    vscode 快捷键一键生成vue模板 点击File gt Preferences gt User Snippets 搜索框搜索vue 打开vue json 会有如下代码 可自行配置 可默认 Place your snippets for
  • Webkit for Android分析

    转自 http mogoweb net archives 182 网上有许多webkit的分析文章 其中针对android porting的一篇文章WebKit WebKit For Android 写的非常好 分析得非常深入 不过这篇文章
  • 二、svg文字之排版

    1 transform rotate 90 80 80 的使用
  • 【Segment Anything Model】一:SAM分割任何事物模型官网使用介绍

    点击订阅专栏 查看专栏列表和对应知识点 本文为seg SAM系列文章 在持续更新 文章目录 1 简明扼要 2 分割效果 3 开始探索 Segment Anything Model的核心愿景 Segment Anything Model已经实
  • [TPAMI‘21] Heatmap Regression via Randomized Rounding

    paper https arxiv org pdf 2009 00225 pdf code https github com baoshengyu H3R 总结 本文提出一套编解码方法 编码 random round整数化 激活点响应值表征
  • AI行业快报:人工智能最新最全资讯!

    大家好 我是写作机器人小智 这是我自己写的文章哦 所有AI行业快报1秒生成 AI行业动态 近日 阿联酋驻华大使与搜狗公司IoT事业部产品总监 就中阿人工智能发展 未来合作等话题展开了交流 期间 搜狗旅行翻译宝直接承担了同传的角色 搜狗旅行翻
  • Python3.8.1的安装和运行

    01Python 3 8 1的安装和运行 在Windows10系统下安装python 1 1访问www python org网站 在浏览器地址栏中输入www python org访问网站 1 2下载python版本 根据自己的需要或者喜好下
  • 无压力轻松使用Obsidian写newsletter

    quail平台特点 拥有四大特点 开源 人工智能增强 web3和加密货币集成 超越电子邮件 开源 每个人都应该可以访问驱动其工具的代码 通过我们的服务 您可以放心地了解背后发生的事情 人工智能增强 为了创建一个真正智能的工具 我们知道需要在
  • Android Fragment

    Android实习札记 4 Fragment 碎片 基本概念解析 转载请注明出处 coder pig Fragment相信大家都不会陌生吧 侧滑啦 抽屉效果啦 DialogFragment啊等等 一堆地方都会 用到Fragment 对于Fr