activity 点击后传递数据给fragment_【磨叽教程】Android进阶之Fragment的管理以及事务执行...

966fff1253661eb303b1637f4d70f27b.png导读:本文大约2000字,预计阅读时间3分钟。本文纯属技术文,无推广。21f487ecd5ca74c8bf0a5eff377b326f.png

正文

    如要管理 Activity 中的Fragment,需使用 FragmentManager。如要获取它,请在Activity 调用 getSupportFragmentManager()

使用 FragmentManager 可执行的操作包括:

  • 通过 findFragmentById()(针对在 Activity 布局中提供界面的Fragment)或 findFragmentByTag()(针对提供或不提供界面的Fragment)获取 Activity 中存在的Fragment。

  • 通过 popBackStack()(模拟用户发出的返回命令)使Fragment从返回栈中弹出。

  • 通过 addOnBackStackChangedListener() 注册侦听返回栈变化的侦听器。

如上文所述,也可使用 FragmentManager 打开一个 FragmentTransaction,通过它来执行某些事务,如添加和移除Fragment。

    在 Activity 中使用Fragment的一大优点是,可以通过Fragment执行添加、移除、替换以及其他操作,从而响应用户交互。

    提交给 Activity 的每组更改均称为事务,并且可使用 FragmentTransaction 中的 API 来执行这些事务。也可将每个事务保存到由 Activity 管理的返回栈内,从而让用户能够回退Fragment更改(类似于回退 Activity)。

    如下所示,我们可以从 FragmentManager 获取一个 FragmentTransaction 实例:

FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每个事务都是我们想要同时执行的一组更改。我们可以使用 add()remove() 和 replace() 等方法,为给定事务设置想要执行的所有更改。然后将事务应用到 Activity,最后必须调用 commit()

不过,在调用 commit() 之前,我们需要调用 addToBackStack(),以将事务添加到Fragment事务返回栈。该返回栈由 Activity 管理,允许用户通过按返回按钮返回上一Fragment状态。

例如,以下示例说明如何将一个Fragment替换为另一个Fragment,以及如何在返回栈中保留先前的状态:

// Create new fragment and transactionFragment newFragment = new ExampleFragment();FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();// Replace whatever is in the fragment_container view with this fragment,// and add the transaction to the back stacktransaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);// Commit the transactiontransaction.commit();

在本例中,newFragment 会替换目前在 R.id.fragment_container ID 所标识的布局容器中的任何Fragment(如果有的话)。通过调用 addToBackStack()可以将替换事务保存到返回栈,以便用户能够通过按返回按钮撤消事务并回退到上一Fragment。

然后,FragmentActivity 会自动通过 onBackPressed() 从返回栈检索Fragment。

如果您向事务添加多个更改(如有一个 add()或 remove()),并调用 addToBackStack(),则调用 commit() 前应用的所有更改都将作为单一事务添加到返回栈,并且返回按钮会将它们一并撤消

向 FragmentTransaction 添加更改的顺序无关紧要,不过以下两点需要注意:

  • 最后必须调用 commit()

  • 如果要向同一容器添加多个Fragment,则添加Fragment的顺序将决定它们在视图层次结构中出现的顺序。

    如果没有在执行删除Fragment的事务时调用 addToBackStack(),则事务提交时该Fragment会被销毁,用户将无法回退到该Fragment。不过,如果在删除Fragment时调用 addToBackStack(),则系统会停止该Fragment,并随后在用户回退时将其恢复。

提示:对于每个Fragment事务,都可通过在提交前调用 setTransition() 来应用过渡动画。

调用 commit() 不会立即执行事务,而是在 Activity 的界面线程(“主”线程)可执行该操作时,再安排该事务在线程上运行。不过,如有必要,也可以在界面线程直接调用 executePendingTransactions(),以立即执行 commit() 提交的事务。通常不会这样做,除非其他线程中的作业依赖该事务。

注意:只能在 Activity 保存其状态(当用户离开 Activity)之前使用 commit() 提交事务。如果您试图在该时间点后提交,则会引发异常。这是因为如需恢复 Activity,则提交后的状态可能会丢失。

本节先介绍到这里,下节我们继续讨论Fragment是怎么与Activity通信以及使用Fragment创建菜单项。有问题欢迎关注“计算机自学平台”并留言讨论哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值