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

添加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 只能提交一次;

0818b9ca8b590ca3270a3433284dd417.png

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()方法的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值