Android应用开发—FragmentManager如何管理fragments

本文主要摘录自Android中使用FragmentManager管理fragments 和 浅谈FragmentManager与fragment之一二事

先讲下自己对fragment的理解:

对于fragment,有太多官方文档和博文来介绍,此处不做转述:我感觉android提供fragment这种组件给了开发者更多的“创造”的机会,开发者可以基于fragment自己创造、管理页面的处理逻辑,fragment之于android,就相当于activity之于android,activity就是fragment的操作系统(容器)。

fragment和activity的区别在于:

fragment的生命周期方法是由托管activity而不是操作系统调用的,因为操作系统无法得知Activity用来管理视图的fragment,fragment的使用是在Activity它自己内部处理。
作者: Lynhaw
链接:https://www.imooc.com/article/4403
来源:慕课网

FragmentManager:

为了管理Activity中的fragments,需要使用FragmentManager。可以通过调用getFragmentManager() | getSupportFragmentManager()获取FragmentManager。

因为FragmentManager的API是在Android 3.0,也即API level 11开始引入的,所以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法。

Fragment Transactions:

使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。

如何获取FragmentTransaction类的实例:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每个transaction是一组同时执行的变化的集合。用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);// Commit the transaction
transaction.commit();

在这个例子中:

  • newFragment将取代在R.id.fragment_container容器中的fragment,如果没有,将直接添加新的fragment。
  • 通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。
  • 当你移除一个fragment的时候,如果commit()之前没有调用addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment会是stopped,可以通过返回键来恢复。

commit()方法:

调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。(这样做通常是没有必要的,除非这个transaction被其他线程依赖。)

注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组指针 和 指针数组

最近发现公司有些人说怎样区分 数组指针 和 指针数组 ? 其实 很简单; 数组指针, 先是(定语 ) (主体), (定语 数组) (主体 指针&#xff09…

在云服务器上注意GeoServer和ShadowDataMap的跨域设置

在云服务器上注意GeoServer和ShadowDataMap的跨域设置 1、对于支持cors的网络资源 可以在ShadowDataMap的devserverconfig.json里设置相应的跨域资源 提示:geoserver发布的地图服务虽然同在一个服务器上,但是端口不一样,同样需要设置跨域 如&…

Guava ImmutableCollection简介

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ImmutableCollection代码定义 GwtCompatible(emulatedtrue) public abstract class ImmutableCollection<E> extends AbstractCo…

Todo List

fragment里面如何处理back按键事件。 fragment里面无法Override onBackPressed接口&#xff0c;如何优雅的处理back press事件&#xff1f;activity如何获取当前活跃的fragment对象。异步网络请求如何改造成rxjava&#xff0c;rxjava有设置运行线程的能力&#xff0c;异步请求…

常见的几种负载均衡算法

1、轮询将所有请求&#xff0c;依次分发到每台服务器上&#xff0c;适合服务器硬件相同的场景。优点&#xff1a;服务器请求数目相同&#xff1b; 缺点&#xff1a;服务器压力不一样&#xff0c;不适合服务器配置不同的情况&#xff1b; 2、随机请求随机分配到各台服务器上。优…

基于 Token 的身份验证方法

基于 Token 的身份验证方法 使用基于 Token 的身份验证方法&#xff0c;在服务端不需要存储用户的登录记录。大概的流程是这样的&#xff1a;客户端使用用户名跟密码请求登录 服务端收到请求&#xff0c;去验证用户名与密码 验证成功后&#xff0c;服务端会签发一个 Token&…

Android应用开发-图片加载库Glide

Glide Picasso和Glide之间的区别&#xff1a; Picasso 仅仅缓存了全尺寸的图像&#xff1b;然而 Glide 缓存了原始图像&#xff0c;全分辨率图像和另外小版本的图像。

excel 表格导入 - java 实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; imp…

C语言 API

MySQL的C语言API接口 1、首先当然是连接数据库&#xff0c;函数原型如下&#xff1a; MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned…

线程组之间的JMeter传递变量

下面&#xff0c;我们将看看如何在线程组之间共享和传递变量。在开发高级JMeter脚本时&#xff0c;很可能您将拥有多个线程组。每个线程组将执行不同的请求。一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组需要…

python第九天(9-33)

一&#xff1a;进程 进程概念 进程就是一个程序运行在一个数据集上的一次动态执行过程进程一般由程序&#xff0c;数据集&#xff0c;进程控制块组成进程控制块&#xff1a; 进程控制块用来记录进程的外部特征&#xff0c;描述进程的执行变化过程&#xff0c;系统可以利用它来控…

Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt问题的解决

删除了/Users/tycao/.gradle/wrapper/dists目录下对应的gradle-X.X-all目录重新sync了

双机热备份和负载均衡的区别

1、双机热备相当于2台服务器其中有一台是另一台的备机&#xff0c;也可以互为备机&#xff1b;而且这两台主机的数据时实时同步的&#xff1b;主机在运行服务时&#xff0c;备机处于检测状态&#xff0c;主机发生故障后&#xff0c;备机将接管主机的服务。2、负载均衡是在这2台…

Python 数据类型--Bytes类型

一、Bytes类型 在Python3以后&#xff0c;字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的&#xff0c;bytes类型是以字节为单位处理的。 bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样&#xff0c;也是不可变的序列对象。 bytes对象只…

Android应用开发-onNewIntent()

转载自Android中 activity 的onNewIntent函数

文件结构

C语言文件名命名的规则 1、文件标识符分为两部分&#xff0c;即文件名前缀和后缀。文件名前缀的最前面要使用范围限定符——模块名&#xff08;文件名&#xff09;缩写。 2、采用小写字母命名文件&#xff0c;避免使用一些比较通俗的文件名&#xff0c;如&#xff1a;publi…

POJ 1187 陨石的秘密 (线性DP)

题意&#xff1a; 公元11380年&#xff0c;一颗巨大的陨石坠落在南极。于是&#xff0c;灾难降临了&#xff0c;地球上出现了一系列反常的现象。当人们焦急万分的时候&#xff0c;一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察&#xff0c;科学家们发现陨石上刻…

bzoj2561 最小生成树

题意&#xff1a;给你无向图&#xff0c;给定一条边&#xff0c;求至少在原图中删去多少边才能使它同时在某个最大生成树和某个最小生成树中。 解&#xff1a; 假装我们把边排序了&#xff0c;然后把所有边权小于给定边的边都加进去了。 那么我们要删的就是s到t的一个割。 最大…

Android应用开发—onSaveInstanceState方法什么时候被调用?

转载自onSaveInstanceState方法什么时候被调用?&#xff08;转载/整理&#xff09; 在 Activity 被销毁之前被调用来保存每个实例的状态&#xff0c;这样就可以保证该状态能够从 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢复过来。 本方法在 Activity 可能被销毁…

记一次phpstudy重启后Apache无法启动

相信大家都碰到过phpstudy中Apache无法启动的情况1、首先检查80端口是否占用&#xff0c;有的话就管理2、检查是否缺少vc9运行文件如果上述两种方法还不能解决问题就进入安装目录中Apache的bin目录下&#xff0c;在命令行窗口中执行httpd.exe&#xff0c;看看是否报错。我就是在…