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

本文介绍了Android Fragment的回退栈概念,包括如何将Fragment加入回退栈以实现场景回滚,以及如何使用popBackStack()方法弹出栈中特定的Fragment。在学习过程中,通过实例展示了如何在回退栈中管理Fragment,以便在实际开发中实现更灵活的用户交互体验。
摘要由CSDN通过智能技术生成

    在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习。

一、回退栈

    在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状态,一般我们都会按返回键,如下图所示:

    然而发现并没有按照我们想要的那样进行,反而退出了程序,那应该怎么得到想要的效果呢?

    我们知道Activity有任务栈,用户通过startActivity将Activity加入栈,点击返回按钮将Activity出栈。Fragment也有类似的栈,称为回退栈(Back Stack),回退栈是由FragmentManager管理的。

    如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。

    默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment加入回退栈并实现事物回滚,首先需要在commit()方法之前调用事务的以下方法将其添加到回退栈中:

  • addToBackStack(String tag):标记本次的回滚操作。

    这里在Fragment添加、删除、替换案例的基础来进行学习,布局代码和Fragment代码不变,只需要在MainActivity的onClick方法中增加一行代码即可,代码如下:

package com.cqkxzsxy.jinyu.android.fragmentbasemanager;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button mAddBtn = null;
    private Button mRemoveBtn = null;
    private Button mReplaceBtn = null;
    private Fragment mSecondFragment = null;
    private Fragment mThirdFragment = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAddBtn = (Button) findViewById(R.id.add_btn);
        mRemoveBtn = (Button) findViewById(R.id.remove_btn);
        mReplaceBtn = (Button) findViewById(R.id.replace_btn);

        // 创建和获取Fragment实例
        mSecondFragment = new SecondFragment();
        mThirdFragment = new ThirdFragment();

        // 设置监听事件
        mAddBtn.setOnClickListener(this);
        mRemoveBtn.setOnClickListener(this);
        mReplaceBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // 获取到FragmentManager对象
        FragmentManager fragmentManager = getFragmentManager();
        // 开启一个事务
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        // Fragment操作
        switch (v.getId()) {
            case R.id.add_btn:
                // 向容器内加入Fragment
                if (!mSecondFragment.isAdded()) {
                    fragmentTransaction.add(R.id.fragment_container1, mSecondFragment);
                }
                if (!mThirdFragment.isAdded()) {
                    fragmentTransaction.add(R.id.fragment_container2, mThirdFragment);
                }
                break;
            case R.id.remove_btn:
                // 从容器类移除Fragment
                fragmentTransaction.remove(mSecondFragment);
                break;
            case R.id.replace_btn:
                if (!mSecondFragment.isAdded()) {
                    fragmentTransaction.replace(R.id.fragment_container2, mSecondFragment);
                }
                break;
            default:
                break;
        }

        // 加入回退栈
        fragmentTransaction.addToBackStack(null);
        // 提交事务
        fragmentTransaction.commit();
    }
}

    重新运行程序,先点击“ADD”按钮,然后再点击返回键,效果如下:

    可以看到这次只是简单的回退到了之前的状态,并没有退出Activity。如果要退出Activity,需要再按一次返回键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值