Fragment 事务 回退栈

一些相关API

1、Fragment常用的三个类:

android.app.Fragment 定义android.app.FragmentManager 用于在Activity中操作Fragmentandroid.app.FragmentTransaction 保证一些列Fragment操作的原子性。事务

2、FragmentManager可以做的事情: 
  • 使用findFragmentById (适用于在静态fragment,不常用)或 findFragmentByTag (适用于动态加载的fragment,常用)获取activity中存在的fragment
  • 使用 popBackStack()将fragment从后台堆栈中弹出 (模拟用户按下BACK 命令)
  • 使用 addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener
  • 开启一个事务 FragmentTransaction transaction = fm.benginTransatcion()
3、FragmentTransaction中常用API
  • transaction.add() 往Activity中添加一个Fragment
  • transaction.remove() 从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁
  • transaction.replace() 使用另一个Fragment替换当前的Fragment,实际上就是remove()+add()
  • transaction.hide() 隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
  • transaction.show() 显示之前隐藏的Fragment,在使用之前要判断是否为空以及是否隐藏
  • detach() 会将【view】从【UI】中移除,和remove()不同,此时fragment的【状态】依然由FragmentManager维护
  • attach()  重建【view】视图,附加到【UI】上并显示
  • transatcion.commit() 提交一个事务,注意:commit方法一定要在Activity.onSaveInstance()之前调用。
4、几个API的区别
  • 比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望回到A还能看到数据,则适合你的就是hide和show,当然了不要使劲在那new实例,进行下非null判断;而如果不希望保留用户操作,你可以使用remove() + add(),或者replace()。
  • 在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其【视图】结构,【实例】并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

Fragment回退栈-Activity

类似于Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。

如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

FragmentManager fm = getFragmentManager();

FragmentTransaction transaction = fm.beginTransaction();

transaction.add(R.id.id_content, new MyFragment(fm, 1), "ONE");

//注意第一个Fragment若加入回退栈,当点击Back键后仅仅是把此Fragment干掉了,并不会退出应用。实际将会出现白板!

//transaction.addToBackStack("");//如果不加这句,点击后会直接退出应用

transaction.commit();

}

}


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<FrameLayout

android:id="@+id/id_content"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#fff" >

</FrameLayout>

</RelativeLayout>

Fragment回退栈-Fragment


public class MyFragment extends Fragment implements OnClickListener {

    private FragmentManager fm;

    private int num;

    /**

     * 请设置num=1

     */

    public MyFragment(FragmentManager fm, int num) {

        this.fm = fm;

        this.num = num;

    }

    private Button mBtn;

    private TextView tv;

    @Override

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

        View view = inflater.inflate(R.layout.fragment, container, false);

        tv = (TextView) view.findViewById(R.id.tv);

        //若onCreateView被调用了,TextView的数值也会跟着变

        tv.setText(new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.CHINA).format(new Date()));

        mBtn = (Button) view.findViewById(R.id.btn);

        mBtn.setText("Fragment--" + num);

        mBtn.setOnClickListener(this);

        return view;

    }

    @Override

    public void onClick(View v) {

        FragmentTransaction transaction = fm.beginTransaction();

        switch (num) {

        case 1:

            //添加到了回退栈后Fragment的实例虽然不会被销毁,但是视图层次依然会被销毁,即会重新调用onDestoryView和onCreateView

            transaction.replace(R.id.id_content, new MyFragment(fm, 2), "Fragment--" + num);

            break;

        case 2:

            //这里我们没有使用replace,而是先隐藏了当前的Fragment,然后添加了新的Fragment实例,最后将事务添加到回退栈

            transaction.hide(this);

            //当从第三个Fragment返回时,第二个Fragment并没有更新

            transaction.add(R.id.id_content, new MyFragment(fm, 3), "Fragment--" + num);

            break;

        case 3:

            Toast.makeText(getActivity(), "最后一个了", Toast.LENGTH_SHORT).show();

            return;//这里使用return

        }

        //如果不添加事务到回退栈,前一个Fragment实例会被销毁,点击后会直接退出应用

        transaction.addToBackStack("");

        transaction.commit();

    }

} 

<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent" >     <Button         android:id="@+id/btn"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_centerInParent="true"         android:background="#ccf"         android:gravity="center"         android:text="点击进入下一个Fragment"         android:textColor="#000"         android:textSize="18sp" />     <TextView         android:id="@+id/tv"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_below="@+id/btn"         android:layout_centerHorizontal="true"         android:ellipsize="end"         android:gravity="center"         android:singleLine="true"         android:text="内容"         android:textColor="#f00"         android:textSize="18sp" /> </RelativeLayout>

来自为知笔记(Wiz)

时间: 2024-10-11 20:51:31

Fragment 事务 回退栈的相关文章

fragment 事务回滚 ---动态创建fragment

1 import java.util.Date; 2 import java.util.LinkedList; 3 4 import com.qianfeng.gp08_day23_fragment5.fragment.TestFragment; 5 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.app.Fragment; 9 import android.app.FragmentTrans

Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView

Fragment回退栈  类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化. 如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment. 一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity.   transaction.add(R.id.right, rightFragment); transaction.addToBack

清空Fragment回退栈中某个Fragment之上的所有Fragment

根据debug信息查看Fragment回退栈的情况,具体debug代码如下: int num = getActivity().getSupportFragmentManager().getBackStackEntryCount(); String numString = "++++++++++++++++++++++++++++++++++Fragment回退栈数量:"+num; TALogger.d("Fragment", numString); for (int

Fragment事务管理源码分析

概述 在Fragment使用中,有时候需要对Fragment进行add.remove.show.hide.replace等操作来进行Fragment的显示隐藏等管理,这些管理是通过FragmentTransaction进行事务管理的.事务管理是对于一系列操作进行管理,一个事务包含一个或多个操作命令,是逻辑管理的工作单元.一个事务开始于第一次执行操作语句,结束于Commit.通俗地将,就是把多个操作缓存起来,等调用commit的时候,统一批处理.下面会对Fragmeng的事务管理做一个代码分析 分

新手关于FragmentTransaction(回退栈)容易误解的地方

说来惭愧,在开始的时候,我就进入了所谓的误区,直到今天才明白. 那么,所谓的误区是什么? 你认为,FragmentTransaction中储存的是什么? 一开始,我以为里面存放的,是上一个Fragment. 现在才知道里面放着的,其实,是一系列对框架的操作. 为什么? 可以根据添加到回退栈的方法进行回推. 我们通常都是通过以下的方式进行存如回退栈: FragmentManager manager = getFragmentManager(); FragmentTransaction transa

springmvc事务回滚失效

转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTemplate.搭框架时,发现了一个事务无法正常回滚的问题,记录如下: 首先展示问题: Spring applicationContext.xml配置: [html] view plaincopy <bean id="dataSource" class="org.spring

JDBC 事务回滚

package jdbcstu; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TransactionTest { public static void main(String[] args) { Connection conn=null; try { conn=getConnectio

Activity回退栈使用

当一个APP启动时,系统会为这个APP创建一个回退栈(任务),用于保存APP所有已经创建的额Activity.当应用启动时,主窗口将第一个被压入回退栈,当显示本应用的其他窗口时,也会按显示顺序创建窗口压入回退栈.回退栈的顶层窗口将会获得焦点,可以与用户交互.当执行Activity的finish方法或者按Back键时,顶层窗口将出栈被销毁,下一个窗户获得焦点同用户交互.例如一个APP有3个窗口,分别为:A.B.C,其中A为主窗口,当从A启动B,在从B启动C,从C启动A时,此时回退栈的顺序为AàBà

ssh事务回滚,纪念这几个月困扰已久的心酸

以前的事务采用的是JTA,xml注入的方式.本人就着开发要优雅合理利用轮子的态度,一直不满意JTA式的申明和切入方式. spring的注解方式多优雅,可是万恶的直到项目快要上线时终于找到了注解式不能回滚的缘由. Spring的事务回滚,当且仅当捕获到RuntimeException类型异常时,才会回滚,对普通Exception异常无效. 满满一把心酸泪,,, 原理:代码贴上: 配置可参考如下:http://blog.csdn.net/greensurfer/article/details/752