Fragment的正确使用方式

Fragment的基本用法 一、Fragment 二、创建一个Fragment 1.静态加载Fragment (1)创建Fragment布局文件 left_fragment.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout 阅读详情

fragment是我们经常使用到的一个控件,但是,相信大家会出现这样的一个问题,每次切换fragment的时候,fragment就会重新调用一次生命周期的方法,从而会重新加载一次数据,这样既消耗用户的数据流量和机器性能; 现在就教大家一个方法,来解决这个问题; 之前我们一直都是这样写的代码:

<code class="hljs java has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
     * 根据传入的参数来改变当前的fragment
     *
     *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @param</span> fragment
     */</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">showFragment</span>(Fragment fragment) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.main_fl_content, fragment);
        transaction.commit();
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

翻看了Android官方文档,发现,replace()这个方法只是在上一个Fragment不再需要使用时采用的简便方法。正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。(这也是谷歌官方推荐的做法)

<code class="hljs java has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"> <span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
     * 修改显示的内容 不会重新加载
     * to 下一个fragment
     * mContent 当前的fragment
     */</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">switchContent</span>(Fragment to) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (mContent != to) {
            FragmentTransaction transaction = fragmentManager
                    .beginTransaction().setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out);
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!to.isAdded()) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判断是否被add过</span>
                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 隐藏当前的fragment,将 下一个fragment 添加进去</span>
                transaction.hide(mContent).add(R.id.main_fl_content, to).commit(); 
            } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 隐藏当前的fragment,显示下一个fragment</span>
                transaction.hide(mContent).show(to).commit(); 
            }

            mContent = to;
        }

    }</code>
ViewPager+Fragment缓存view的正确方式 在我将Eclipse中的项目转到AS时遇到一个问题,项目中使用了 ViewPager+Fragment 实现滑动页面,但是每次切换页面时都会通过 OnCreateView 方法新建一个view,这样很没必要,可以 缓存View 来减少不必要的开销。 阅读详情

相关推荐

Android入门第61天-Fragment嵌套Fragment的用法

Fragment嵌套可以构成各种复杂的组件、布局。但是在其使用时经常会面临各种“坑 ”,特别是嵌套Fragment在有些开发机、真机上可以显示而换到另一台开发机、真机上就不能显示并且还会抛出或者干脆不抛Exception也不显示Fragment中内容的坑,本文教给大家正确的Fragment嵌套的调用返回的用法。

打造全国最全的AI Agent开发知识领域的博客 2700

Fragment基本使用

阅读目录 1. Fragment概述 1.1 介绍 1.2 Fragment基本生命周期 2. Fragment使用 2.1 静态加载 2.2 动态加载Fragment 2.3 使用注意点 3. Fragment与Activity联动 3.1 回退栈 4. Fragment与Activity通信 4.1 传递数据给Fragment 4.2 传递数据给Activity 5. Fragment间通信 5.1 setArguments() 5.2 同Activi

chuyouyinghe的专栏 4987

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 878

【12】应用开发——Fragment的使用

Fragment是一种可以嵌入在Activity中的UI片段,在平板上应用非常广泛。我们可以在一个Activity中引入多个Fragment来显示更多的内容,因此Fragment可以很好的在大屏幕Android设备中发挥作用。

熊熊饲养员的优快云! 1573

Unity坦克物理系统:履带驱动与力场建模实战指南

在游戏物理仿真中,履带车辆的运动建模远超传统轮式控制器的范畴。其核心在于摒弃WheelCollider的滚动幻觉,转向基于牛顿力学的力与力矩协同求解——通过主推进力场、转向力矩场和地面反作用力场三重叠加,实现对质量、摩擦、惯性及坡度阻力的真实响应。这种建模方式不仅支撑坦克爬坡、陷泥、侧倾等复杂行为,更保障了多人同步与高帧率下的物理稳定性。Physics Tank Maker 正是这一思路的工业级落地,它将PhysX底层机制与坦克动力学深度耦合,提供可调参数、事件驱动视觉反馈及标准扩展接口,成为面向严肃模拟类

weixin_29535577的博客 563

从梯度泄露到数据复原:DLG与iDLG算法实战解析

本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。

weixin_30552811的博客 193

Fragment切换和隐藏,显示(show,hide)

代码演示XML <LinearLayout 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:

sky__cat的博客 2610

什么是深度展开网络?如何将迭代算法的每一次迭代展开成深度网络对应的一层?深度展开网络进行端对端训练,其中端对端是什么意思?

在深度学习和机器学习的背景下,“端到端”(End-to-end)训练指的是将输入数据直接映射到最终输出的过程,而不需要任何中间的手动数据预处理或特征工程。- **自然语言处理**:端到端自然语言处理系统可以将自然语言输入直接转化为计算机可理解的语言输出,而不需要对语言进行分解和转化。- **推荐系统**:通过使用深度神经网络,端到端推荐系统可以直接根据用户历史行为预测其未来的兴趣爱好,并推荐相应的产品或服务。4. **直接映射**:从输入到输出的直接映射,中间没有任何拆分或分解的过程。

m0_67897882的博客 5440

33、Fragment使用方法详解

一、Fragment的生命周期 Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系: 可以看到Fragment比Activity多了几个额外的生命周期回调方法:onAttach(Activity) 当Fragment与Activity发生关联时调用。onCreateView(...

lanxuan1993的博客 2083

使用-flat.vmdk文件恢复ESXI虚拟机的vmdk文件

解决flat.vmdk文件丢失恢复问题

神秘人的博客 6775

基于STM32的设计智慧超市管理系统(带收银系统+物联网环境监测)_167

本系统主要由超市环境监测部分和商品管理部分组成。环境监测部分主控芯片采用STM32F103C8T6,主要包括温湿度传感器、烟雾传感器和空调制热开关、空调制冷开关,采集的数据通过ESP8266模块+MQTT协议上传至OneNet云平台,在OneNet云平台设计手机和电脑版本可视化页面,能够在页面上查看超市的环境信息,还能在页面上手动打开空调制热开关和空调制冷开关。商品管理部分主要由RC522-RFID读卡器、上位机组成,实现商品选购、结算、顾客的VIP会员卡注册管理等功能。

6071

Fragment正确切换方式

点击打开链接

wugezi的博客 282

静态代码审计插件 snyk 使用教程

静态代码审计插件 snyk 使用教程

SHELLCODE_8BIT的博客 2006

Fragment中创建ViewModel的正确方式

当我们使用ViewPager(或ViewPager2)时,在Fragment重建后,ViewModel会被重新创建(与Fragment重建前的ViewModel不是同一个)以为传入参数key后就ok了,然而ViewModel仍然被重建了。后来发现,这么写,问题很大==直到改成这样,才万事大吉^_^之前一直都是这么写的。

chuyouyinghe的专栏 1480

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android新建model,Android笔记之Fragment中创建ViewModel的正确方式

之前一直都是这么写的pageViewModel = ViewModelProviders.of(this).get(PageViewModel.class); //参数this是当前fragment后来发现,这么写,问题很大==当我们使用ViewPager(或ViewPager2)时,在Fragment重建后,ViewModel会被重新创建(与Fragment重建前的ViewModel不是同一个...

weixin_31021649的博客 2112

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Kotin- Fragment 获取 ViewModel 实例正确方式

Ativity 或 Fragment 获取 ViewModel 实例的方法,使用 kotlin 编写

weixin_43838793的博客 2399

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android学习--Fragment,金九银十正确打开方式

android:orientation=“vertical” android:background="#00ff00"> 然后分别新建LeftFragmet和RightFragment两个类继承Fragment,并且重写onCreateView()方法 package com.example.fragmenttest import android.os.Bundle import android.view.LayoutInflater import android.view.View import

m0_63935510的博客 432

Fragment中调用SimpleAdapter问题

在Fragment中使用ListView的时候,需要使用适配器

瞎几把学 1万+

Android中添加Fragment的正确姿势

前言: 我们在平时开发中必定会运用到Fragment,经常会出现一些莫名其妙的问题,比如在旋转屏幕或被系统杀掉重启时,出现bug,这说明你添加Fragment的姿势不对!在这里我总结一下自己在项目中添加Fragment的方式,我且称之为正确姿势,如有不对的地方或者更好的方式,欢迎大家留言指出! 正文: 一、在一个Activity中添加一个Fragment的正确姿势 Activity...

k_bb_666的博客 8093

Activity中使用Fragment笔记

Activity中使用Fragment,如何避免Activity恢复时Fragment叠加问题。ViewPager中选择合适的Adapter,打造高效流畅Fragment列表。Fragment数据延时加载,保存和恢复,打造流畅高效的列表。

hwliu51的笔记 5167

关于在Fragment中请求权限使用记录

在activity中,我们通常使用 ActivityCompat.requestPermissions(final @NonNull Activity activity, final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode); 方法来请求权限;但是在Fragmen...

qq_37108755的博客 1278

在多层嵌套的 Fragment 结构中(例如 MainActivity → FragmentA → FragmentB),onActivityResult 可能无法正确传递到 FragmentB,解决

在多层嵌套的Fragment结构中,onActivityResult可能无法正确传递到FragmentB,主要原因包括:1. Activity未正确转发回调:Activity的onActivityResult只会传递给直接子Fragment(如FragmentA),而不会自动传递给嵌套的FragmentB。解决方法是在FragmentA中手动转发回调。2. Fragment生命周期问题:确保FragmentB在调用startActivityForResult时处于活跃状态。3. requestCode冲突:

白高林的专栏 970

【Android】创建和使用fragment

SDK版本问题 如果你的系统需要运行在3.0

岁月静好 8541

Fragment的使用

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

2401_84149724的博客 892

如何正确的判断当前的Fragment是否对用户可见?

前言:写这篇文章的背景是最近做项目处理Fragment中曝光埋点逻辑时,发现当我切换到其他的Fragment时,页面从不可见到可见的过程中,已经隐藏的Fragment的onResume方法仍然会执行,究其原因是因为Fragment的生命周期是跟随其载体Activity的生命周期走,所以这个时候载体MainActivity从onPause-&gt;onResume过程中,会触发每个已经存在了的Fr...

我是紫色紫色的专栏 4万+
上一篇: android开发adb端口被占用问题
下一篇: RecycleView的使用步骤
coder_e
博客等级 码龄10年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值