添加Fragment的方法

说明:在这里使用的是android-support-v4.jar中的Fragment,而不是系统自带的Fragment,V4包的兼容性更强。

静态添加方法

新建一个项目FragmentDemo1,新建一个布局文件fragment_frist.xml: <?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#ffff0a10"

>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Fragment-----1"

android:textSize="20sp"

android:textColor="#f9151208"

/>

同样的,我们再新建一个布局文件fragment——second.xml: <?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#ffff0a10"

>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Fragment-----1"

android:textSize="20sp"

android:textColor="#f9151208"

/>

然后,新建一个java文件,这里我命名为FirstFragment,这个类是继承Frament(V4包中的,注意导包),代码如下: package com.lucas.fragmentdemo1.fragments;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import com.lucas.fragmentdemo1.R;

/**

* Created by lucas on 2015/9/10.

* Author:lucas

* email:huangxiang1992@hotmail.com

*

* FragmentDemo1

*/

public class FirstFragment extends Fragment {

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_first, container, false);

}

}

同样的,在继续新建一个java文件,SecondFragment: package com.lucas.fragmentdemo1.fragments;

import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import com.lucas.fragmentdemo1.R;

/**

* Created by lucas on 2015/9/10.

* Author:lucas

* email:huangxiang1992@hotmail.com

*

* FragmentDemo1

*/

public class SecondFragment extends Fragment {

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_second, container, false);

}

}

接下来就是MainActivity.java及其布局文件的编写了,首先来看java文件: package com.lucas.fragmentdemo1;

import android.os.Bundle;

import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

/**

* Called when the activity is first created.

*/

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

代码非常简单,就是要注意我们的Fragment文件是继承的v4包中的Fragment,那么我们的Activity也要继承v4包中的FragmentActivity,而不是Activity,不然会产生类型转换异常。

接下来,我们来看布局文件main.xml: <?xml version="1.0" encoding="utf-8"?>

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:id="@+id/fragment_one"

android:name="com.lucas.fragmentdemo1.fragments.FirstFragment"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

/>

android:id="@+id/fragment_two"

android:name="com.lucas.fragmentdemo1.fragments.SecondFragment"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

/>

静态添加fragment,即是在Activity的布局文件中,指定其要加入的Fragment的完整名称即可。

动态添加方法

相比与静态添加,我们更倾向于动态的添加Fragment,下面索要说的就是如何在代码中动态的添加Fragment。

我们继续引用上述的Fragment文件,稍作修改即可。

首先对main.xml文件修改一下: <?xml version="1.0" encoding="utf-8"?>

Fragment事务

事务,就是用来管理Fragment的。

add(int containerID,Fragment)添加Fragment到容器

replace(int containerId, Fragment) 将container中,原有的

Fragment移动和remove,之后,再添加指定的Fragment.

remove(Fragment) 删除 Fragment。

commit() 使事务的操作⽣效。

事务的提交,一个transaction 只能提交一次;

Fragment回退栈

每一个FragmentManager都会保留一个回退栈,这个回退栈记录的是事务的操作步骤

当Activity按返回键的时候,如果内部的回退栈有多个事务记录,那么就回一步一步的后退,直到回退栈清空,才退出。

应用场景,通常都是一个功能的内部延伸,才会采用回退栈,例如:“联系人列表–>联系人详情 –>联系人编辑”这种,当用户点击返回键,就需要一步一步后退。

FragmentTransaction事务回滚方法及回退栈内容监听

Fragment的回退栈,是一种记录,记录事务的操作,如果事务被添加到回退栈,那么一般情况下,当返回的时候,会对事务的操作进行一个逆转,从而恢复事务执行之前的内容。

若想使用回滚功能,我们只需要在commit之前,使用addToBackStack()将其添加到回退栈之中。在需要回退的时候,使用PopBackStack()将最上层的操作弹出回退栈。

回退栈的原理:

当事务被添加到回退栈的时候,FragmentManager会将事务的操作,添加到回退栈中,作为一个记录存在。

当返回的时候,查找回退栈,如果有内容,那么对记录进行反转的操作。如add反转为remove,replace调整为remove和add,从而还原事务之前之前的状态。

FragmentManager.PopBackStack() 弹出回退栈,相当于后退键的操作。

使用FragmentManager.PopBackStack(String name,int flags)可以回退到指定的位置。

回退栈主动返回的操作

通常,Activity点击返回键,会触发回退栈的返回操作,返回的方式是一个记录一个记录的返回

对于FragmentManager可以手动的管理回退栈,通过方法,进行弹出记录,跳跃返回两种操作。

当事务添加返回栈操作的时候,使用addToBackStack(String name)这个方法,如果指定名称,就可以从其它回退栈记录跳到指定名称的记录位置。

回退栈操作的API

回退栈可以通过事务 addToBackStack(String name)来记录, name 给记录指定名称;

回退栈由 FragmentManager 来管理,通过这个类可以直接进⾏回退栈的控制,包括获取回退栈个数,直接弹出回退栈记录,以及跳转到指定记录上。这个记录之上的内容,全部弹出。

FragmentTransaction.addToBackStack(String name)

FragmentManager.popBackStack() 返回上一个记录

popBackStack(String name, int flags) 返回到指定的记录上, flags 代表是否将指定名称的记录也弹出。

boolean popBackStackImmediate(String name , int flags)立即弹出,如果弹出成功,返回true,否则返回false。

关于事务的注意事项

事务只能够执行一次commit();每次进行Fragment操作的时候,都需要使用FragmentManager.beginTransaction()返回一个新的事务,才能够正确进行操作。

不要将事务声明为成员变量。!!!

Fragment事务操作与生命周期

事务操作,对于生命周期,会有直接的影响。

事务在添加Fragment的时候, Fragment 生命周期从onAttach 开始执行,直到显示位置 onResume状态;

事务在进⾏replace的时候,会将在容器中存在Fragment ,进行移除操作, 从 onPause() 状态,执行 到 onDetach(),最终这个Fragment与Activity没有任何关系了;新的Fragment和添加这样的生命周期。

关于Fragment的查找

findFragmentById(int id);用于查找xml布局中包含的Fragment,就是为什么 < fragment > 标签必须要有id, 或者tag属性。

findFragmentByTag(String tag); 用于查找 xml中,或者是代码添加的Fragment,这些Fragment 通过tag命名的。

在add的时候,可以指定 tag参数: add(int, Fragment,String tag) 将Fragment命名,需要获取的时候,findFragmentByTag就可以找到了。

Fragment增删改查方法介绍

add方法

FragmentTransaction add(int containerViewId, Fragment f)将Fragment 添加到当前Activity布局中 指定id的ViewGroup中.

containerViewId代表:Fragment添加到哪里,一定是一个容器。

replace方法

replace(int containerViewId, Fragment f) 将指定ID的容器内部的内容替换为 fragment。

remove方法

删除方法:用于删除特定的Fragment, 指定的Fragment将会从布局中直接删掉。 不需要指定容器,因为:一个Fragment只能够在一个容器中存在,不会同时在多个容器中存在。 删除的方法使用的场景: replace() 方法实际上进行的是 先删除旧的Fragment的内容,再进行add()方法的操作。

事务回退机制 android,【Android基础】——Fragment-使用方法相关推荐

  1. SpringBoot事务传播机制

    6.Spring的事务传播机制: 1)定义:咱们之前所说的事务,都是针对一个方法的,咱们的Spring事务传播机制,不再是单个的事务了,咱们的Spring事务传播机制定义了包含多个方法相互调用的时候, ...

  2. Android零基础入门第89节:Fragment回退栈及弹出方法

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一. ...

  3. Android零基础入门第85节:Fragment使用起来非常简单

    2019独角兽企业重金招聘Python工程师标准>>> Fragment创建完成后并不能单独使用,还需要将Fragment加载到Activity中,在Activity中添加Fragm ...

  4. Android零基础入门第87节:Fragment添加、删除、替换

    2019独角兽企业重金招聘Python工程师标准>>> 前面一起学习了Fragment的创建和加载,以及其生命周期方法,那么接下来进一步来学习Fragment的具体使用,本期先来学习 ...

  5. Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)

    上一篇文章简单介绍了Android的回调机制的使用,这一篇博文将重点介绍Fragment碎片与activity的数据交互,fragment在Android开发中起着至关重要的作用,通过官方Androi ...

  6. Android零基础入门第86节:探究Fragment生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用.Fragment可 ...

  7. 01.Android之基础组件问题

    2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的 ...

  8. 01.Android之基础组件问题 1

    目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的Activity被系统回收怎么办?说一下onSaveInstanceSta ...

  9. Android 逆向基础

    Android 反编译教程 博客内容 基本知识 几个重要的工具 技术原理 apktool dex2jar + jd-gui DEX文件结构学习 Monkey使用手册 Android权限列表以及说明 博 ...

最新文章

  1. [Leetcode] Combinations 组合数
  2. HDU2675(二分算法)
  3. 刷题-CC150-Java实现
  4. python向图片里添加文字
  5. Leetcode 674.最长递增序列
  6. clear nTotal nNum=1计算机考试,信息学奥赛常考算法——模拟法
  7. Java高级语法笔记-匿名类(Anonymous Class)
  8. 逆波兰式数学表达式求解
  9. 描述最常用的5种http方法的用途_RESTful API系列之HTTP基础
  10. ant+testng 搭建
  11. 主机网络切换后,docker toolbox里的容器网络不通了,解决方法
  12. HDU 2531 (BFS搜索)
  13. 国家/地区编码中文对照表
  14. 【Openbravo开发】Openbravo windows开发环境搭建
  15. java calendar星期几_java使用Calendar类判断今天是星期几
  16. 从零开始学_JavaScript_系列(五)——dojo(基础,动画移动,重力模拟,动画合并,添加标签)
  17. Visio 去掉页边距和空白页的方法
  18. Programming Ruby 读书笔记(七)
  19. 极致的遮罩处理(一):DeepFaceLab手动遮罩编辑。
  20. mysql查询所有男生中姓王的_MySQL的查询练习

热门文章

  1. 这两个小技巧,让SQL语句不仅躲了坑,还提升了1000倍
  2. 扒一扒面向对象编程的另一面
  3. 解读金融高频交易不出错的金手指:分布式事务管理
  4. 一文带你了解传统手工特征的骨龄评估方法的发展历史
  5. 搞清楚一道关于Integer的面试题
  6. CNN转换为SNN的算法
  7. 【numpy】numpy.random.uniform()函数
  8. python 错误AttributeError: ‘dict_keys‘ object has no attribute ‘sort‘
  9. Anaconda创建跟别人环境配置一样的虚拟环境(coda env creat -f environment.yml)
  10. 特征工程系列学习(零)引言