void onClick(View v) { MyFragment myFragment = new MyFragment(); //获取管理器,开始事务 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction 在这里管理更方便 tag移除,这是Fragment的一个标签 2:获取管理器和开始事务 这两行代码尽量不要提取成方法成员变量,避免一些未知错误 //获取管理器,开始事务 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction 中提供的方法在当前类中直接获取Fragment管理器 (2)使用事务 开始事务 将当前某个Activity关联控件当中 第一个参数,第二个参数:你要添加的是哪个Fragment,第三个参数:要添加的Fragment在FragmentManager
在Fragment的开发文档中明确指出,Fragment的管理都是通过FragmentManager来实现的,那么问题出现在哪呢?在网上搜了一番终于发现了症结所在。
FragmentManager 是 Android 中用于管理 Fragment 的组件,它是 Fragment 生命周期和后退栈操作的核心。 FragmentManager 允许开发者添加、移除、替换和找到 Fragment 实例,同时处理 Fragment 之间的交互和事务。 要删除Android FragmentManager中的所有Fragment并重建它们,您可以遵循以下步骤:获取FragmentManager实例。 FragmentManager fragmentManager = getSupportFragmentManager(); // 如果在AndroidX中使用// 或// FragmentManager 以下是一个示例代码,演示如何删除所有Fragment并重建它们:// 获取FragmentManager实例FragmentManager fragmentManager = getSupportFragmentManager
调用的是Activity的getLayoutInflater 这句代码原本是没有什么问题的,但是在Fragment中使用就有问题了。
先来看看 FragmentManager。 FragmentManager public abstract class FragmentManager {...} (FragmentManager fm, Fragment f) {} public void onFragmentSaveInstanceState(FragmentManager fm FragmentManager 所有 Fragment 生命周期变化的回调。 以及回退栈的列表,这和 FragmentManager 的要求一致。 Fragment、FragmentManager、FragmentTransaction 关系 Fragment 其实是对 View 的封装,它持有 view, containerView, fragmentManager
如何在 Android 中使用 FragmentManager 删除所有的 Fragment 并重新创建它们 在 Android 中,FragmentManager 可以用来管理 Fragment 的添加 本文将介绍如何使用 FragmentManager 来实现这个功能。 步骤1:获取 FragmentManager 对象 首先,我们需要获取 FragmentManager 对象。 在 Activity 中的示例代码如下: FragmentManager fragmentManager = getSupportFragmentManager(); 步骤2:删除所有的 Fragment 接下来,我们可以使用 FragmentManager 的 popBackStack() 方法来删除所有已添加的 Fragment。 总结 本文介绍了如何使用 FragmentManager 删除所有的 Fragment,并重新创建它们的步骤。
FragmentManager FragmentManager顾名思义是用来管理fragment的. getSupportFragmentManager()就是获取所在fragment 的父容器的管理器 FragmentManager宿主环境指的是其管理类,通常在Activity中通过接口getSupportFragmentManager或者getFragmentManager获得FragmentManager 对象, 可以认为Activity是FragmentManager的宿主环境类. FragmentManager宿主环境类状态变化时(如onStart, onResume, onStop等回调),FragmentManager的状态也随之更新(FragmentManager类有一个成员变量 从用户的角度来看, FragmentManager的宿主环境类管理了一系列Fragment,并且Fragment随着FragmentMannager的宿主环境类的状态变化而变化. image.png
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269) </RelativeLayout> java代码 private void initMap() { FragmentManager fragmentManager = getFragmentManager (); if (fragmentManager ! </RelativeLayout> private void initMap() { FragmentManager fragmentManager = getChildFragmentManager (); SupportMapFragment mapFragment = new SupportMapFragment(); fragmentManager.beginTransaction
如果您使用 Fragment,就是通过 FragmentManager 来进行添加、移除和交互操作。 提示 : 本文中我会谈论很多关于 FragmentManager 的内部原理。 FragmentManager 的 moveToState() 方法 每个 FragmentManager 都关联着一个宿主 (host)。 然而,FragmentManager 似乎并没有按照这个过程操作,而是将 Fragment 和整个 FragmentManager 置于一个奇怪的、不一致的状态。 协调其它 Fragment 通过分离 FragmentManager,整体逻辑已经在各个层次进行了大幅简化: FragmentManager 仅仅包含用于所有 fragment 的状态 FragmentStateManager
然后 FragmentManager 会将该事务作为它返回栈的一部分。 这会使得 FragmentManager 恢复到最初提交 Fragment 事务之前的状态。 这就需要调用 saveBackStack() 并且紧跟一个新的事务: fragmentManager.saveBackStack("profile") fragmentManager.commit { () 操作,然后调用 restoreBackStack(): fragmentManager.saveBackStack(“notifications”) fragmentManager.restoreBackStack (“profile”) 这两个堆栈项高效地交换了位置: △ 交换堆栈项后的 FragmentManager 状态 维持一个单独且活跃的返回栈并且将事务在其中交换,这保证了当返回按钮被点击时,FragmentManager
提示 : 本文中我会谈论很多关于 FragmentManager 的内部原理。 FragmentManager 的 moveToState() 方法 每个 FragmentManager 都关联着一个宿主 (host)。 然而,FragmentManager 似乎并没有按照这个过程操作,而是将 Fragment 和整个 FragmentManager 置于一个奇怪的、不一致的状态。 也就是说将分散在 FragmentManager 中的逻辑集中到一个地方。 再通过容器中的 SpecialEffectsController 协调其它 Fragment 通过分离 FragmentManager,整体逻辑已经在各个层次进行了大幅简化: FragmentManager
The target set here is retained * across instances via {@link FragmentManager#putFragment * FragmentManager.putFragment Fragment fragment, int requestCode) { // Don't allow a caller to set a target fragment in another FragmentManager but there's a snag: people do set target fragments before fragments get added. // We'll have the FragmentManager final FragmentManager mine = getFragmentManager(); final FragmentManager theirs = fragment ! throw new IllegalArgumentException("Fragment " + fragment + " must share the same FragmentManager
在上一期我们学习了FragmentManager和FragmentTransaction的作用,并用案例学习了Fragment的添加、移除和替换,本期一起来学习Fragment显示和隐藏、绑定和解绑。 对象 FragmentManager fragmentManager = getFragmentManager(); // 开启一个事务 FragmentTransaction 对象 FragmentManager fragmentManager = getFragmentManager(); // 开启一个事务 对象 FragmentManager fragmentManager = getFragmentManager(); // 开启一个事务 FragmentTransaction 对象 FragmentManager fragmentManager = getFragmentManager(); // 开启一个事务 FragmentTransaction
说一下getFragmentManger方法 /** * Return the FragmentManager for interacting with fragments associated * *
If this Fragment is a child of another Fragment, the FragmentManager * returned here will be the parent's {@link #getChildFragmentManager()}. */ final public FragmentManager getFragmentManager() { return mFragmentManager; } /** * Return a private FragmentManager for placing and managing Fragments * inside of this Fragment. */ final public FragmentManager
代码: FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); String name = fragment.getClass().getName(); fragmentTransaction.replace (R.id.container, fragment).addToBackStack(nameForBackstackstate).commit(); 弹出时这么做: fragmentManager.popBackStackImmediate (FragmentA.class.getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 这个方法的第二个参数 POP_BACK_STACK_INCLUSIVE
为什么呢,因为第二次setAdapter的时候,已经被FragmentManager缓存的Fragent不会被新建,也不会被刷新,因为FragmentPagerAdapter在调用destroy的时候, 采用的是detach的方式,并未真正的销毁Fragment,仅仅是打算销毁了View,这就导致FragmentManager中仍旧保留正Fragment的缓存: @Override public void 新的FragmentPagerAdapter被设置后,会通过instantiateItem函数来获取Fragment,这个时候它首先会从FragmentManager的缓存中去取Fragment,取到的 Fragmentmanager Transaction栈的意义 最后看一下Fragmentmanager中Transaction栈,FragmentManager的Transaction栈到底是做什么的呢 FragmentManager对于Fragment的缓存管理 FragmentManager主要维护三个重要List,一个是mActive Fragment列表,一个是mAdded FragmentList
fragmentManager, String message){ return showProgress(fragmentManager, message, true, null); } public static CommonDialogFragment showProgress(FragmentManager fragmentManager, String message , boolean cancelable){ return showProgress(fragmentManager, message, cancelable, null); } public static CommonDialogFragment showProgress(FragmentManager fragmentManager, final String message 就以 加载中的弹出窗 为例,来看看我们是怎么实现的 public static CommonDialogFragment showProgress(FragmentManager fragmentManager
= null private var fragmentManager: Reference<FragmentManager>? = null) return val fragmentManager = fragment.parentFragmentManager.also { fm -> this.fragmentManager = WeakReference(fm) } fragmentLifecycleCallbacks = ClearOnDestroy let { fragmentManager -> fragmentLifecycleCallbacks?. let(fragmentManager::unregisterFragmentLifecycleCallbacks) } fragmentManager = null
中添加UI fragment FragmentManager 类负责 fragment 视图添加到 activity 中,具体会管理 fragment 队列和 fragment 事务回退栈。 activity被销毁时,它的FragmentManager会将fragment队列保存下来。 这样,activity重建时,新的FragmentManager会首先获取保存的队列,然后重建fragment队列,从而恢复到原来的状态。 的FragmentManager负责调用。 添加 fragment 供 FragmentManager 管理时,onAttach(Context?)、onCreate(Bundle?)和onCreateView(...)函数会被调用。
/> 在Activity中添加代码 // Define a tag String to represent the FlutterFragment within this // Activity's FragmentManager forward calls to it later. private FlutterFragment flutterFragment; // Get a reference to the Activity's FragmentManager FragmentManager fragmentManager = getSupportFragmentManager(); // Attempt to find an existing FlutterFragment flutterFragment = (FlutterFragment) fragmentManager .findFragmentByTag(TAG_FLUTTER_FRAGMENT if (flutterFragment == null) { flutterFragment = FlutterFragment.createDefault(); fragmentManager