Android初级开发笔记 -- 关于Fragment的回退栈

本文介绍了Android中Fragment的概念、生命周期及其回退栈的工作原理。Fragment是可嵌入Activity的组件,具有自己的生命周期,受Activity影响。文章通过实例详细解析了Fragment在回退栈中的行为,包括replace操作对Fragment生命周期的影响,以及hide和show方法的区别。
摘要由CSDN通过智能技术生成

一直想好好研究一下项目中经常用到的Fragment。这篇先记录一下对Fragment的回退栈的学习。

一、什么是Fragment

Fragment是Android3.0之后引入的可嵌入activity中的碎片化组件,实现了界面的最大化利用。有以下几个特点:
(1)不可独立存在,但是有自己的生命周期。不过因为与activity关联在一起,生命周期会受activity影响。
(2) 可静态引入也可动态加载。推荐使用support-v4中的android.support.v4.app.Fragment而非系统内置的android.app.Fragment。因前者能让Fragment在所有Android系统版本中保持功能一致性。

二、Fragment的生命周期

  • 先po一张经典生命周期图:
    在这里插入图片描述
    我们可以看到有几个关键的回调方法。

onAttach()
Fragment和Activity建立关联的时候调用(获得activity的传递的值)

onCreateView()
为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局)

onActivityCreated()
当Activity中的onCreate方法执行完后调用(表示activity执行oncreate方法完成了的时候会调用此方法)

onDestroyView()
Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局)

onDetach()
Fragment和Activity解除关联的时候调用(脱离activity)

  • 不同情况下的方法回调

当一个fragment第一次被加载到屏幕上的时候,会依次执行:

onAttach()
onCreate()
onCreateView()
onActivityCreated()

接着,当这个fragment对用户可见的时候,会依次执行:

onStart()
onResume()

这个时候,如果该fragment进入了停止状态(“进入后台模式”),会依次执行:
onPause()
onStop()

若这个fragment被销毁了(或者和ta关联的activity被销毁了),在执行了上面两个方法之后紧跟着会执行:
onDestroyView()
onDestroy()
onDetach()

此时该fragment被销毁并且与activity解除了关联。

  • 前面我们说到,fragment的生命周期受到ta关联的activity的生命周期的影响~
    影响有多大呢?看图说话~
    在这里插入图片描述
    好了,那么如果该fragment没有被销毁呢?当ta又重新回到了运行状态,会依次执行:

onCreateView()
onActivityCreated()
onStart()
onResume()
因为没有被销毁,所以onCreate()不会被调用。

额那什么情况下fragment没有被销毁呢?这就和fragment的回退栈有关啦~

三、实例讲述Fragment回退栈

我们知道Activity是以栈的方式进行管理的,Fragment也有类似的方式。

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

首先我们先认识下这个方法:FragmentTransaction.addToBackStack(String)【把当前事务的变化情况添加到回退栈,一般传入null即可】

接下来我们用一个例子来证明一下其起到的作用以及生命周期是否真的有所不同。

MainActivity的布局文件

<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="match_parent"  
        android:layout_height="match_parent" >  
    </FrameLayout>  

</RelativeLayout>

MainActivity.java文件

public class MainActivity extends Activity {
     

    protected void onCreate(Bundle savedInstanceState){
     
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);  

        FragmentManager fm = getFragmentManager();  
        FragmentTransaction tx = fm.beginTransaction();  
        tx.add(R.id.id_content, new FragmentOne(),"ONE");  
        tx.commit();  
    }  
}

FragmentOne.class文件

public class FragmentOne extends Fragment implements OnClickListener {
     

    private Button mBtn;  

    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {
     
        View view = inflater.inflate(R.layout.fragment_one, container, false);  
        mBtn = (Button) view.findViewById(R.id.bn_fragment_one);  
        mBtn.setOnClickListener(this);  
        Log.e("onCreateView", "one");
        return view;  
    }  

    @Override  
    public void onClick(View v) {
     
        FragmentTwo fTwo = new FragmentTwo();  
        FragmentManager fm = getFragmentManager();  
        FragmentTransaction tx = fm.beginTransaction();  
        tx.replace(R.id.id_content, fTwo, "TWO");  
        tx.addToBackStack(null); 
        tx.commit();  
    }  
    @Override
    public void onAttach
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值