Fragment基础入门

Fragment入门 Fragment必须被“嵌入”Avtivity中使用,因此Fragment也拥有自己的生命周期,不过Fragment的生命周期受Activity所控制,也就是说Activity停止的时候,Activity中所有的Fragment都会被停止。2、Fragment(碎片、片段) - 碎片化学习(Fragmental Learning)每次切换碎片时,都是利用new来创建新的碎片,这样在不断切换碎片的过程中,就导致资源的浪费。修改主界面类MainActivity,在碎片列表类里保存程序所需要的碎片对象。 阅读详情

1 Fragment是什么?

Frament也叫碎片,片段。是Google在Android 3.0引入的,主要为了给大屏幕的UI提供支持的。Frament可以理解为一个迷你的Activity或者是Activity的模块化的组件,它有自己的生命周期与显示界面,我们可以利用多个Frament嵌套在Activity达到以下的功能,如适配平板,或适配横竖屏幕,或者在程序运行的过程中动态的更改我们的UI界面。如下图:上图是显示应用运行在手机情况下,从一个列表页面跳转到详细页面的例子。如果我们不使用Fragment的情况,当应用运行在平板上面的情况,就只能显示放大版的手机显示的界面,为了利用平板的特性,Android在3.0版本中提供了Fragment技术,我们就可以将列表与内容以组件的方式插入,在手机上分屏显示两个内容,在平板上面就可以左右显示两个内容。

您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或删除片段(有点像您可以在不同 Activity 中重复使用的“子 Activity”)。

片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。

2 如何使用Fragment

2.1 创建Fragment

如果需要使用Fragment的话,需继承Fragment类,目前有两个Fragment类:

  • android.support.v4.app.Fragment

  • android.app.Fragment

第一种是sdk提供的是3.0以上提供的类,第二是 android support v4 版本提供的向下兼容类,建议使用第二个类。

继承Fragment至少需实现以下方法:

  • onCreateView() 系统会在片段首次绘制其用户界面时调用此方法,并将创建的UI界面返回

2.2 使用Fragment

  • 在 Activity 的布局文件加入 fragment 控件

  • 在代码中通过编程方式将片段添加到某个现有ViewGroup

2.2.1 在布局文件中添加一个Fragment
  <fragment android:name="com.example.news.ArticleListFragment"
        android:id="@+id/list"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

android:name 属性指定要在布局中实例化的 Fragment 类。注意如果是在xml中声明的Fragment的话,建议给这个Fragment设置id或者tag,以便后期来find查找该Fragment。

2.2.2 使用代码添加一个Fragment到某个现有ViewGroup
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(android.R.id.content, list,"abc").commit();

2.3 传值给Fragment

  • 不要通过写构造方法来传参,因为Android源码中是使用反射调用的无参构造方法,写带参数的构造方法会导致无法进行状态保存,并可能导致代码抛异常。

  • 通过Fragment的方法、或者回调进行传值

  • setArguments getArguments

    Bundle b = new Bundle();
    b.putCharSequence("label", label);
    f.setArguments(b);

3 Fragment的生命周期

创建时的生命周期

  • onAttach:Fragment开始与Activity关联

  • onCreate:系统会在创建片段时调用此方法。您应该在实现内初始化您想在片段暂停或停止后恢复时保留的必需片段组件。

  • onCreateView:系统会在片段首次绘制其用户界面时调用此方法。 要想为您的片段绘制 UI,您从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供 UI,您可以返回 null

  • onActivityCreated:Activity onCreate完成的回调

移除时的生命周期

  • onSaveInstanceState:处理Fragment 需要保存数据的方法。

  • onDestroyView:将Fragment的View试图从UI中移除

  • onDetach:将Fragment与Acitivity取消关联

4 Fragment的操作FragmentTransaction

我们可以使用FragmentTransaction来对Fragment进行操作,如add、replace、attach、detach

4.1 add--将一个Fragment添加到一个页面,可以重复叠加
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.add(R.id.content, fragment, "my");
    transaction.commit(); 

add(int containerViewId, Fragment fragment, String tag)方法中:

  • containerViewId:将Fragment加入的ViewGroup的id

  • fragment:被操作的Fragment

  • tag:被操作的Fragment的标示,我们操作成功后可以使用这个tag找到相应的Fragment

4.2 replace--将容器内的Fragemnt移除后,再进行添加
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.content, fragment, "my");
    transaction.commit();  

replace(int containerViewId, Fragment fragment, String tag)方法中:

  • containerViewId 将Fragment替换的ViewGroup的id

  • fragment 被操作的Fragment

  • tag 被操作的Fragment的标示,我们操作成功后可以使用这个tag找到相应的Fragment

4.3 detach--将一个Fragment从UI上面解绑
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.detach(fragment);
    transaction.commit();

注意解绑并不是删除,我们还可以通过其他方法把解绑的Fragment重新绑定到UI上面。

4.4 attach--将一个Fragment绑定到UI
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.attach(fragment);
    transaction.commit();
4.5 remove--将一个Fragment从Activity删除
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.remove(fragment);
    transaction.commit();
4.6 Show--显示一个Fragement
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.show(fragment);
    transaction.commit(); 
4.7 hide--隐藏一个Fragment
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.hide(fragment);
    transaction.commit(); 
4.8 commit与commitAllowingStateLoss

Activity在以下的操作下容易引起回收并触发onSaveInstanceState()

  • 按下HOME键

  • 按下电源按键(关闭屏幕显示)时

    • 屏幕方向切换

    • Activity跳转的时候

    以上几种情况下不能进行状态的提交,如果提交的话会出现以下错误

    Can not perform this action after onSaveInstanceState

    出现这个错误的时候,我们有两个解决方法:

    1. 不在onSaveInstanceState后提交commit

    2. 使用commitAllowingStateLoss

5 Fragment与返回键

默认情况下,Fragment是不会响应返回键的。如果需要做到类似Activity回退到上一个界面这样的效果,必须将FragmentTransaction,加入返回栈。加入回退栈的方法如下:

    FragmentTransaction transaction = fm.beginTransaction();
    transaction.add(R.id.content, fragment, "my"+index);
    transaction.addToBackStack(null);

addToBackStack(String name); name 参数代表这次FragmentTransion的名称,我们可以根据这个名称找到相应的操作,并进行回退动作。也可以传null,代表不记录该次操作的名称。如果我们将某次操作加入回退栈的话,我们有一下几种方式进行回退:

  • 使用返回键系统自动回退到上一次操作前的状态。

  • 使用popBackStack回退到指定的操作的状态。

其中不同的方法可以做不同事情:

  • popBackStack(),会回退到上一次操作前的状态

  • popBackStack(String name, int flags),会回退到某次name的操作状态,flag为0或POP_BACK_STACK_INCLUSIVE时,则代表清除name的状态

  • popBackStack(int id, int flags)会回退某个id的操作状态,id为commit()返回的。

6 Fragment动画

默认情况下Fragment显示和隐藏是不显示动画的,不过FragmentTransaction提供了三种显示的动画的方式

  • setTransition 使用系统提供的默认显示动画

  • setCustomAnimations 使用自定义动画。

setTransition (int transit) 可以使用系统提供的默认动画,可供选择的有:

  • TRANSIT_NONE

  • TRANSIT_FRAGMENT_OPEN

  • TRANSIT_FRAGMENT_CLOSE

setCustomAnimations (int enter, int exit,int popenter,int popexit) 能够使用自定义动画.这四个参数分别代表:

  • enter 设置Fragment进入动画

  • exit 设置Fragment退出动画

  • popenter popback后回滚状态后上一个Fragment的动画

  • popexit popback后回滚状态后当前的Fragment的动画

注意:setCustomAnimations 需要在FragmentTransaction的设置事务之前(如add),就要调用。

7 Fragment间的交互

使用回调的方式,让FragmentActivity充当中间交互的桥梁。

7.1 onSaveInstanceState

Fragment被回收前的回调,我们可以使用Bundle来保存需要缓存的数据


8 Fragment使用常用例子

8.1 横竖屏显示不同界面
  1. 新建一个类OrientenActivity继承FragmentActivity

  2. 创建两个Fragment分别用于显示列表和内容页面。FirstFragment 与 ContetnFragment

  3. 在OrientenActivity的布局文件activity_orienten.xml中添加FirstFragment。

    <fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/list"
    android:name="com.it520.fragment_land_pro.FristFragment"
    />
  4. 再新建一个文件夹起名叫layout-land,在文件夹中再新建一个同名的activity_orienten.xml的布局文件,把两个Fragment放入布局中。

    <fragment
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="2"
    android:id="@+id/list"
    android:name="com.it520.fragment_land_pro.FirstFragment"
    />
    ​
    <fragment
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:id="@+id/content"
        android:name="com.it520.fragment_land_pro.ContentFragment"
        />
  5. 为FirstFragment添加数据,人工的添加50条数据

  6. 为了让Fragment与Activity交互,使用回调OnClickItemListener。

  7. 在Activity中进行处理,当OnClickItemListener被回调时。获取ContetnFragment。如果获取失败,目前Acitivity是在竖屏状态,跳转ContentActivity。

  8. 如果获取成功,手机是横屏状态,传递值给ContentFragment


安卓讲课笔记5.5 Fragment入门 1. 熟悉Fragment生命周期; 2. 能正确使用Fragment切换界面 阅读详情

相关推荐

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用Fragment的基本使用一、什么是Fragment二、Activity+多个Fragment Fragment的基本使用 ->返回总目录<- 一、什么是Fragment Fragment是一种可以嵌入在Activity当中的UI片段,因为它和Activity看起来太像了。Fragment是依赖于Activity的,不能独立存在,一个Activity里可以有多个Fragment 二、Activity+多个Fragment 测

彬sir哥的博客 1349

安卓学习笔记5.4—Fragment入门

Fragment是android3.0引入的新API,它代表Activity的子模板,所以可以把fragment理解为Activity片段。Fragment必须被“嵌入”Avtivity中使用,因此Fragment也拥有自己的生命周期,不过Fragment的生命周期受Activity所控制,也就是说Activity停止的时候,Activity中所有的Fragment都会被停止。其他状态也是一样。

justin02191004的博客 747

VLA-JEPA:具身智能中潜空间世界模型的工程落地实践

世界模型是具身智能实现环境理解与因果推演的核心基础,其本质是在状态空间中建模‘动作→结果’的动力学规律。传统基于像素或文本的世界模型因高维、非平稳、弱语义等缺陷,在真实机器人场景中鲁棒性差、部署成本高。JEPA(联合嵌入预测架构)通过构建物理约束的潜空间,将视觉-语言-动作(VLA)信号统一编码为低维、可微、可解释的状态表征,显著提升模型对抖动、遮挡、光照突变等干扰的适应能力,并支持实时闭环控制。该范式已在UR5e、Franka等多构型机械臂及Jetson边缘平台完成实测验证,成为VLA系统从实验室走向产线

weixin_34357928的博客 336

fragment入门

Android Fragment 教程 1 Fragment是什么? Frament也叫碎片,片段。是Google在Android 3.0引入的,主要为了给大屏幕的UI提供支持的。 Frament可以理解为一个迷你的Activity或者是Activity的模块化的组件,它有自己的生命周期与显示界面,我们可以利用多个Frament嵌套在Activity达到以下的功能,如适配平板,或适配横竖屏

baidu_37872898的博客 339

Li‘s 核磁共振影像数据处理-4-使用3D Slicer从DTI计算参数图(FA、ADC等)

从DTI计算参数图 通过3D Slicer软件计算 主要步骤 导入DICOM影像 3D Slicer似乎只能支持DICOM格式和NRRD格式的DTI处理,而无法支持NIFTI+磁场梯度信息文件的方式。(这里不确定,如有错误请指正。) 模块选择: 需要选择或设置的内容包括:选择DicomToNrrd,设置Output DWI Volume file,设置Input Dicom Data Directory。设置好后点击“Apply”。 制作mask。 实质就是去脑壳。 模块选择: 需要设置的内

weixin_38594676的博客 3921

淘晶驰串口屏自定义协议实战:5分钟搞定苹果时钟通信(附完整代码)

本文详细介绍了如何使用淘晶驰串口屏自定义通信协议快速实现苹果风格时钟的通信功能。通过精简的协议设计和完整的代码示例,开发者可以在5分钟内完成从硬件连接到软件实现的整个过程,适用于嵌入式开发中的高效通信需求。

weixin_29184371的博客 323

解析Fragment

自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态的使用Fragment,Fragment回退栈,Fragment事务;以及Fragment的一些特殊用途,例如:没有布局的Fr

逍遥飞鹤的专栏 1213

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 468

android fragment入门,Android零基础入门|Fragment显示和隐藏、绑定和解绑

原标题:Android零基础入门|Fragment显示和隐藏、绑定和解绑在上一期我们学习了FragmentManager和FragmentTransaction的作用,并用案例学习了Fragment的添加、移除和替换,本期一起来学习Fragment显示和隐藏、绑定和解绑。 一、Fragment显示和隐藏由于上一期有简单介绍过对应的api,这里直接通过案例来进行学习。创建一个新的module名为fr...

weixin_36391252的博客 1209

MuJoCo 入门教程(一)

在 MuJoCo 仿真中输入自定义数字有三种方法。首先,可在 XML 中定义全局数字字段。它们有一个名称和一个实数值数组。其次,可以通过特定元素的自定义数组来扩展某些模型元素的定义。具体方法是在 XML 元素大小中设置 nuser_XXX 属性。第三,数组 mjData.userdata 不用于任何 MuJoCo 计算。用户可以在这里存储自定义计算的结果;请记住,所有随时间变化的内容都应存储在 mjData 中,而不是 mjModel 中。自定义文本字段可以保存在模型中。

机器人控制与仿真应用 1万+

ROS从入门到精通1-1:ROS核心架构、常用指令与计算图

本文介绍ROS的核心架构,各个文件、目录的用途、常用命令行工具、动态计算图原理。

FRIGIDWINTER的博客 6369

安卓编程基础——Fragment入门

对于多界面安卓应用,当然可以使用多个Activity来实现,但是比较浪费资源,不如在一个Activity中使用多个碎片(Fragment)来实现界面切换效果。

lovepanyuxiao的博客 318

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)

Mculover666的博客(嵌入式) 7242

fragment photoshop_PhotoShop基础入门

PS 视频教程下载地址:https://pan.baidu.com/s/16Ig5ZdQLvUnyFGQP09iEPA密码: xq9y Photoshop课程介绍: PHOTO SHOP • 让你在所有设计领域无所不能!一门高逼格的万能技术,网页美工非TA不可,平面设计的通行证,广告设计的必须技能;不会PS,你无颜面对他(她);从专业修图、广告设计、文字处理、摄影后期、再到网页设计、UI设计.....

weixin_39562998的博客 288

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 521

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android基础——Fragment基础入门(一)

!!!不要在线程当中对UI进行任何操作。Android为开发人员提供了一种能够在线程中更新UI的方式,就是Hundler+Message+Thread。!!!在使用V4包中的Fragment的时候,必须要使用FragmentActivty来加载,如果直接使用Activity的话,将会出现类型转换异常。!!!使用< fragment >标签的时候,必须要给fragment设置id或者是Tag,否则抛异

lucas的编程之旅 594

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android入门教程 | Fragment 基础概念

Fragment,直译为“碎片”,“片段”。Fragment 表示 FragmentActivity 中的行为或界面的一部分。可以在一个 Activity 中组合多个片段,从而构建多窗格界面,并在多个 Activity 中重复使用某个片段。可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且可以在 Activity 运行时添加或移除片段(这有点像可以在不同 Activity 中重复使用的“子 Activity”)。

Android23333的博客 2016

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Fragment使用(上),android基础开发入门

} } 布局文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android” xmlns:app=“http://schemas.android.com/apk/res-auto” xmlns:tools=“http://schemas.android.com/tools” android:layout_width=“ma

m0_66155412的博客 871

android fragment出栈,Android零基础入门|Fragment回退栈及弹出方法

原标题:Android零基础入门|Fragment回退栈及弹出方法在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习。 一、回退栈在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状态,一般我们都会按返回键,如下图所示: 然而发现并没有按照我们想要的那样进行,反而退出了程序,那应该怎么得到想要的效果呢?我们知道Act...

weixin_36049771的博客 1167

Fragment的使用,零基础入门android逆向视频课程

fragment

m0_60721649的博客 1220

当你面试的时候,被问到关于Fragment的种种,android入门基础

public int getBreadCrumbTitleRes(); @StringRes public int getBreadCrumbShortTitleRes(); public CharSequence getBreadCrumbTitle(); public CharSequence getBreadCrumbShortTitle(); } 可以看到 BackStackEntry 的接口比较简单,关键信息就是 ID 和 Name。 //在 Fragment 回退栈中有变化时回调 public

m0_65320833的博客 155

android 替换fragment,Android零基础入门第87节:Fragment添加、删除、替换

前面一起学习了Fragment的创建和加载,以及其生命周期方法,那么接下来进一步来学习Fragment的具体使用,本期先来学习Fragment添加、删除、替换。一、概述在前面的学习中,特别是动态加载的时候,有提到FragmentManager和FragmentTransaction类,这里先来详细了解一下其到底为何物。1、FragmentManager要管理Activity中的Fragments,...

weixin_39830688的博客 1424

Android基础学习笔记20:Fragment入门

Android基础学习笔记20:Fragment入门

m0_63691734的博客 403

『Android基础入门』ViewPager+Fragment+BottomNavigationView实现底部导航

在ViewPager与Fragment结合实现多页面滑动的学习上再进一步,记录一下ViewPager+Fragment+BottomNavigationView实现底部导航 * 1.复习ViewPager的用法 * 2.复习FragmentPagerAdapter的使用 * 3.BottomNavigationView的使用 * 4.ViewPager切换页面与BottomNavigationView的联动 * 5.Badge(新消息提示,图标右上角红圈)

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 5085

【Android基础入门〖11〗】Fragment

目录(?)[+] 一  左侧列表展示 1.1  布局 left_fragment.xml ListView xmlns:android="http://schemas.android.com/apk/res/android"       android:id="@android:id/list"       android:layout_width

iShareStudio 938
上一篇: Android系统设计中存在设计模式分析
下一篇: Android面试题
yipeng95
博客等级 码龄9年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值