Android学习(五)——Fragment

Android Fragment详解 一、什么是Fragment? Fragment:是Android3.0开始新增的概念,意为碎片。Fragment是依赖于Activity的,不能独立存在的。 二、为什么要有Fragment? Android运行在各种各样的设备中,有小屏幕的手机,还有大屏幕的平板,电视等。同样的界面在手机上显示可能很好看,在大屏幕的平板上就未必了,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况。针... 阅读详情

Fragment

fragment本来设计的初中是为了适应大屏幕的平板电脑,现在我们普通的手机开发也会加入这个Fragment,我们可以把他理解为小型的Activity,但是他还是必须嵌套在Activity里使用的,所以我们可以按照直译去理解他——Activity的一个“碎片”。虽然fragment有自己的生命周期,但是还是会受到宿主Activity的影响。

生命周期

这里写图片描述

FragmentManager

这里说一下,fragment目前有两种,一个是v4包的fragment,还一个是原生的fragment,所以fragmentManager的获取方式也有两种:

  • getSupportFragmentManager() 用于v4包获取fragmentManager
  • getFragmentManager() 用于app包的Fragment获取Fragmentmanager

FragmentManager用来处理fragment的一部分操作

  • 使用findFragmentById()或findFragmentByTag()方法,得到Activity中存在的fragment,也可判断Ativity中发fragment是否为空。
  • popBackStack():将back stack中最后一次的fragment转换弹出。如果没有可以出栈的东西,返回false。

FragmentTransaction

这个是具体处理Fragment事务的类,可以执行一些操作例如对fragment增加,删除,替换,隐藏的这些操作

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

transaction.add(R.id.fragment_container, newFragment);//添加一个fragment
transaction.replace(R.id.fragment_container, new2Fragment);//替换一个fragment
transaction.hide(newFragment);//隐藏一个fragment
transaction.remove(newFragment);//删除一个fragment
transaction.addToBackStack(null);加入BACK栈
transaction.commit();//提交事务操作

关于commit方法

  • 调用commit方法并不是立即执行transaction中包含的改变动作,commit方法吧transaction加入activity的UI线程队列中
  • 你只能在activity储存它的状态之前调用commit,如果在储存状态之后调用将会抛出异常(储存状态:也就是用户离开activity,saveInstanceStates的时候)

关于add和replace的性能

fragment替换的方式有两种:
1. add进来 然后 hide调再add一个新的fragment,当想切回之前的fragment的时候hide掉新的fragment,show旧的fragment。
2. add进来,然后replace成新的fragment,当想切回去的时候继续repalce成旧的

之前找到一个博客显示了这两种方式的性能比:
add方式
这里写图片描述

replace方式
这里写图片描述

所以 如果想提升性能的话 尽量使用add方式添加fragment

封装一个添加和切换的方法:

     /**
     * 添加/或展示一个fragment
     * @param fragment 想要添加/展示的fragment
     * @param id 占位布局的ID
     * @param tag 打一个T啊,需要用这个Tag去搜索是否存在这个fragment
     */
    private <T extends Fragment> void addNewFragment( T fragment, int id, String tag) {

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        //优先检查,fragment是否存在,避免重叠
        T tempFragment = (T)fragmentManager.findFragmentByTag(tag);

        if (tempFragment != null) {
            fragment = tempFragment;
        }

        if (fragment.isAdded()) {
            addOrShow(fragmentTransaction, fragment, id, tag);
        } else {
            if (currentFragment != null && currentFragment.isAdded()) {
                fragmentTransaction.hide(currentFragment).add(id, fragment, tag).commit();
            } else {
                fragmentTransaction.add(id, fragment, tag).commit();
            }
            currentFragment = fragment;
        }
    }

    /**
     * 添加/展示fragment方法
     * @param transaction fragment处理事务
     * @param fragment 想要添加/展示的fragment
     * @param id 占位布局的ID
     * @param tag fragment查询标识
     */
    private <T extends Fragment> void addOrShow(FragmentTransaction transaction, T fragment, int id, String tag) {
        if (currentFragment == fragment)
            return;
        if (!fragment.isAdded()) { // 如果当前fragment未被添加,则添加到Fragment管理器中
            transaction.hide(currentFragment).add(id, fragment, tag).commit();
        } else {
            transaction.hide(currentFragment).show(fragment).commit();
        }
        currentFragment.setUserVisibleHint(false);
        currentFragment = fragment;
        currentFragment.setUserVisibleHint(true);
    }

这里讲解一下

首先我们传进来的是 Fragment的子类 用了个泛型(其实这里传一个Fragment也可以,我觉得我好像有点多此一举)
接下来,看流程:

Created with Raphaël 2.1.0传入参数通过Tag查找这个fragment存在?fragment = 查出来的是否添加了?添加或者展示isAdded()?add currentFragment = fragment;结束show当前非空且add?隐藏当前fragmentaddyesnoyesnoyesnoyesno

这样一来,不管你替换什么fragment,只要调用这个方法,就会使用Add方式替换fragment了(这流程挺简单的一看就懂,要是看不懂,直接粘代码简单粗暴)

结语

其他的我就不多讲了,到这里为止就可以初步的使用fragment了,至于更深层的东西希望大家多思考,编程嘛,水深得很,总有更屌的方法,更灵活的方法,更贴近业务的方法,所以,学无止境 !

Fragment 实现简易新闻界面(适配手机与Pad) 一、前言 Android 在 Android 3.0(API 级别 11)中引入了 Fragment,主要目的是为大屏幕(如平板电脑)上更加动态和灵活的界面设计提供支持。由于平板电脑的屏幕尺寸远胜于手机屏幕尺寸,因而有更多空间可供组合和交换界面组件。 例如,新闻应用可以使用一个片段在左侧显示文章列表,使用另一个片段在右侧显示文章,两个片段并排显示在一个 Activity 中,每个片段都拥有自己的一套生命周期回调方法,并各自处理自己的用户输入事件。因此,用户无需使用一个 Activity 来选择文章,然后使用 阅读详情

相关推荐

android ViewPager学习(五)Fragment里嵌套Viewpager的示例

目标: 在fragment内创建

windvally的专栏 3727

移动开发笔记(七) Fragment 手机和平板兼顾 简易新闻应用

1.1动态添加Fragment class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener{ replaceFragment(Ano

q327192368的博客 579

Android中Fragment的使用

目录 一、创建一个Fragment项目 二、在项目中创建一个左碎片布局 三、创建一个类来控制布局 四、创建另一个右碎片布局 五、创建布局对应的类 六、创建第二个右布局 七、创建对应的类 八、更改主布局 九、在主活动中注册功能 Fragmen 主要用于平板电脑或手机横屏 一、创建项目 创建一个新项目项目名为Fragment 二、创建第一个碎片布局 在layout下创建一个布局 右击 layout / New / Layout Resource File 取名为 ..

apple_54592211的博客 4160

第5章:手机平板要兼顾,探究Fragment(笔记)

使用kotlin编写android程序

julicliy的博客 355

安卓学习笔记20:Fragment入门

1. 了解Fragment与Activity的关系; 2. 掌握Fragment的生命周期; 3. 学会编写多Fragment安卓程序

howard2005的专栏 1594

Android使用Fragment实现兼容手机和平板的程序demo

此为示例代码,详细讲解请参考 http://blog.youkuaiyun.com/sinyu890807/article/details/8744943

Android学习笔记—— 五、 关于Fragment的补充信息

1. 为Fragment添加返回栈 在调用remove()、replace()时,让事务提交之前使用addToBackStack (String name)方法,其参数在官方文档的解释为: An optional name for this back stack state, or null. 意为:一个可选的堆栈名称,或者为null FragmentManager fragmentManager...

北方提不起劲 272

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8349

android Fragment系列学习笔记之五

一、Fragment中向Activity中传值(续前节)       在Activity中去获取Fragment中的值,最好的一种方式是在Fragment中去声明一个回调接口,然后在主Activity中去实现这个回调接口。(源代码已经在上一节中给出) 二、前节代码解说:    (1)首先需要在LeftFragment中声明一个回调接口 /** * 接口回调 * 定义完接

青风百草 1005

LabVIEW Modbus TCP通信避坑指南:解决连接中断、服务器异常与自动重连问题

本文详细解析了LabVIEW环境下Modbus TCP通信的常见问题,包括连接中断、服务器异常等,并提供了自动重连机制的实现方案。通过优化错误处理、超时参数和资源管理,帮助开发者构建更稳定的工业级Modbus TCP客户端,显著提升通信可靠性。

weixin_42525211的博客 425

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

Android学习笔记(五)Fragment简介

  Fragment是在Android 3.0 (API level 11)中引入的Activity的子模块。初衷是为了适应大屏幕的平板电脑,我们只需要使用Fragment对UI组件进行分组、模块化管理,就能很方便在运行过程中动态更新Activity的界面。Fragment必须被嵌入Activity中使用个,虽然也拥有自己的生命周期,但其生命周期手它所在的Activity的生命周期的控制...

anxiushang5448的博客 128

WIN10环境下STK11.5(含Analyzer, EOIR, Scheduler插件)的安装与破解全攻略

本文提供了一份详细的WIN10环境下STK11.5软件及其核心插件(Analyzer, EOIR, Scheduler)的安装与破解全攻略。内容涵盖从安装包准备、系统环境检查,到基础版安装、插件部署、破解文件替换及许可证配置的完整步骤,并附有常见问题排错指南,旨在帮助用户免费搭建功能齐全的卫星仿真分析环境。

solidity8miner的博客 757

(一百九十)Android Jetpack 学习(五)—— fragment

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

JT的专栏 618

python 携程登陆_Python 学习练习之用户登录接口

目的:用python实现简单用户注册,登陆,加黑功能,放个流程图吧。以下内容仅为练习 执行流程:[root@zabbix login]# python user_login.pyusername:tompassword:123456Are you want to register ? [y/n]yRegister successful,Please relogin ![root@zabbix lo...

weixin_28679635的博客 518

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

【Android Studio】学习——Fragment

Fragment 是一种可以嵌入在 Android 当中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛。Fragment 和 Activity 非常像,同样可以包含布局,同样都有自己的生命周期。引入 Fragment 的目的是为了在大屏幕(如平板电脑)上能够更加动态和灵活地设计界面,被定义为一个轻量级 Activity而进行设计。

weixin_73595045的博客 3503

使用GitLab的VS Code插件 GitLab Workflow 来进行项目的DevOps管理,助力研发效能

使用VS Code的GitLab Workflow插件,进行项目的DevOps管理,将效率提升到MAX。直接在VScode中管理流水线,一键跳转到创建 Issues,MR

知无涯 5294

安卓 Fragment 学习

本文不详细讲Fragment原理,只用来做个小实例。 什么是Fragment ? Fragment是在安卓3.0版本中添加的,主要是为了解决安卓设备尺寸多样化后界面的显示问题。Fragment比Activity较轻量级,也可以提供与用户交互的界面并且有自己的生命周期,它必须嵌套在Activity中使用。 Fragment是依赖于Activity的,不能独立存在的. 一个Activity里...

森宝的博客 559

PD3.0详解 第十一章 策略层 电源协商(三)(sink端)

前面大师匈介绍了Source端的内容,今天再看一下sink端的内容。大师匈还是想把标准文件的状态机拿出来说一下。大师匈把一张图分成俩部分,大家凑合看一下,一张图实在看不清内容。 Sink 端电源协商状态机。基于sink端哦!!! 上图先!!! 上面俩张图就是整个SINK端口的状态机了。。。介绍一下这个流程: 1、收到hardreset或者刚上电的进入PE_SNK_Startup开始状态。 2、在PE_SNK_Startup阶段后进入PE_SNK_Discovery,并等待Vbus的到来。 3、当Vbus

大师匈的博客 4132

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 静态加载fragment,Android学习——Fragment静态加载

从今天开始做一套安卓的学习笔记,开发环境是Android Studio,把学习过程中的知识和遇到的问题都写在这里,先从Fragment开始学起。Fragment概述Fragment是Android3.0之后引入的全新的概念,主要目的是用于大屏幕设备上,例如平板电脑。简单来说,就我的个人理解,Fragment相当于一个一个集成好的装饰品,可以用来装饰Activity。而在Activity的空间变化了...

weixin_39791152的博客 1552

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android Studio学习:Fragment入门

安卓学习:Frament入门

m0_62491877的博客 2679

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

安卓学习笔记之Fragment

Fragment组件,

告诉自己,每天进步一点点。 2619

安卓Android开发,左边listView右边Fragment切换页面

安卓Android开发,左边listView右边Fragment切换页面

m0_63222566的博客 2263

安卓-Activity与Fragment之间的通信

安卓简单学习记录,fragment向activity传信息

half_m的博客 2994

Android学习之fragment

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。贵在坚持!《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。

2401_84415615的博客 743
上一篇: Android学习(四)——四大组件之ContentProvider
下一篇: 关于常用的排序算法
豪利丶王
博客等级 码龄11年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值