FragmentTransaction是用于执行一组Fragment操作的API。
Fragment弹出在PopBackStack之后调用OnViewCreated
我有 1 个活动和 3 个片段。 (A、B 和 C)。所以, Activity -> FragmentContainerView 与片段 A 我有 1 个活动和 3 个片段。 (A、B 和 C)。所以, Activity -> FragmentContainerView 与片段 A <androidx.fragment.app.FragmentContainerView android:id="@+id/host_fragment" android:name="cl.gersard.shoppingtracking.ui.product.list.ListProductsFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:tag="ListProductsFragment" /> 片段 A 有一个按钮可以转到片段 B 片段 A -> 片段 B(使用 addToBackStack) 然后,我从片段B转到片段C 片段 B -> 片段 C(不带 addToBackStack) 我需要当我在片段C中保存项目时,返回到片段A,所以我不使用addToBackStack。 问题是我在片段 C 中使用时 requireActivity().supportFragmentManager.popBackStack() 或 requireActivity().onBackPressed() 片段 A 出现,但片段 C 中的 OnViewCreated 方法被调用,因此执行我在片段 C 中的验证。 我需要从片段 C 返回片段 A,而不调用片段 C 的 OnViewCreated 兴趣代码 主要活动 fun changeFragment(fragment: Fragment, addToBackStack: Boolean) { val transaction = supportFragmentManager.beginTransaction() .replace(R.id.host_fragment, fragment,fragment::class.java.simpleName) if (addToBackStack) transaction.addToBackStack(null) transaction.commit() } 片段 A(列出产品片段) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupRecyclerView() observeLoading() observeProducts() viewModel.fetchProducts() viewBinding.btnEmptyProducts.setOnClickListener { viewModel.fetchProducts() } viewBinding.fabAddPurchase.setOnClickListener { addPurchase() } } private fun addPurchase() { (requireActivity() as MainActivity).changeFragment(ScanFragment.newInstance(),true) } 片段B(扫描片段) override fun barcodeDetected(barcode: String) { if (processingBarcode.compareAndSet(false, true)) { (requireActivity() as MainActivity).changeFragment(PurchaseFragment.newInstance(barcode), false) } } 片段C(购买片段) private fun observePurchaseState() { viewModel.purchasesSaveState.observe(viewLifecycleOwner, { purchaseState -> when (purchaseState) { is PurchaseSaveState.Error -> TODO() is PurchaseSaveState.Loading -> manageProgress(purchaseState.isLoading) PurchaseSaveState.Success -> { Toast.makeText(requireActivity(), getString(R.string.purchase_saved_successfully), Toast.LENGTH_SHORT).show() requireActivity().supportFragmentManager.popBackStack() } } }) } 完整代码在这里https://github.com/gersard/PurchaseTracking 好的,我想我明白你的问题了。您有条件地将内容添加到后台堆栈,这使片段管理器处于奇怪的状态。 问题 您从 Main 开始,将扫描仪添加到后堆栈,但不添加产品。因此,当您按回键时,您会将 Scanner 从堆栈中弹出,但 Product 仍保留在 FragmentManager 中。这就是为什么每次扫描并返回时都会获取一个新实例的原因。我不清楚为什么会发生这种情况 - 看起来可能是 Android 错误?您正在替换片段,因此奇怪的是正在建立额外的实例。 一个解决方案 将您的 changeFragment 实现更改为有条件地 弹出堆栈,而不是有条件地向其中添加内容。 fun changeFragment(fragment: Fragment, popStack: Boolean) { if (keepStack) supportFragmentManager.popBackStack() val transaction = supportFragmentManager.beginTransaction() .replace(R.id.host_fragment, fragment,fragment::class.java.simpleName) transaction.addToBackStack(null) // Always add the new fragment so "back" works transaction.commit() } 然后反转当前调用 changeFragment 的逻辑:private fun addPurchase() { // Pass false to not pop the main activity (requireActivity() as MainActivity) .changeFragment(ScanFragment.newInstance(), false) } 还有... override fun barcodeDetected(barcode: String) { if (processingBarcode.compareAndSet(false, true)) { // Pass true to pop the barcode that's currently there (requireActivity() as MainActivity) .changeFragment(PurchaseFragment.newInstance(barcode), true) } } 我遇到了同样的问题,这很奇怪,有效地弹出一个片段会重新创建它以保存其状态。 不仅如此,即使在片段中使用生命周期感知函数和 isVisible 方法,即使代码明显不可见,仍然会执行代码。我有依赖于基本片段的片段,该片段在背面将片段从导航中弹出。 我的主要问题是在第一个片段上,即使它应该关闭(并且确实)应用程序,但片段的 onviewcreated 一旦被销毁就会再次被调用,导致一些不应该执行的逻辑(某些 API 调用就我而言,协程以奇怪的状态结束)我所做的是避免在该片段上调用 popBackStack ,而是直接调用 finish 活动,这似乎已经解决了
我打开“活动A”。 “Activity A”立即执行如下 FragmentTransaction 以打开“Fragment A”: FragmentTransaction t = fm.beginTransaction(); ListFragment f = new ProfileFragment(); t.r...
新的 FragmentTransaction commitNow() 内部是如何工作的?
Android N 和支持库版本 24 中添加的新 commitNow() 方法的文档有限且有点令人困惑。 同步提交此事务。任何添加的片段都将
我想要实现的效果是将输入(新)片段覆盖在退出(旧)片段之上, 但是当我用新片段替换旧片段时,旧片段就消失了,新片段滑动了......
我有这样的结构: MainActivity -> ProfileFragment -> ListFragment 其中“->”是 FragmentTransaction.add(....) 我的问题是,我需要 android 来重新加载旧实例吗...
我必须为用户提供在我的应用程序中捕获视频的选项,但我不希望在视频未录制时出现预览(或占用空间)。 因此我使用
FragmentTransaction Android Studio 期间的片段内存泄漏
我在 Android Studio 中使用 LeakCanary 监视我的移动应用程序中的内存泄漏。它们是在一个使用两个 Fragment 进行 FragmentTransaction 操作的活动中发现的。它们都是即时的...
我的Main2Activity里面有5个碎片(home,settings,newPost,notifications和profile)。在HomeFragment里面,我有一个RecyclerView,里面有很多post视图,每个post都包含一个 "open"......。
当使用片段事务时,我们可以使用add和replace方法进行。如果我们使用add,之前的fragment不会被销毁,而是保留在内存中。而如果我们使用replace方法,之前的片段就会被...
我正在尝试实现忘记的密码流程。我想做的是在应用程序内部处理收到的电子邮件,其中包含指向忘记密码网页的链接。使用导航...
Android NavController:onResume / onPause回调重新排序
我正在为Android导航库的非常奇怪的行为而苦苦挣扎。我用这些回调创建了一个片段(为了显示全屏内容,实际的系统UI切换是...
Android:如何在向内部充气RecyclerView时防止Fragment事务出现滞后或动画跳过?
我正在处理一些片段,但是从一个切换到另一个时的过渡动画非常缓慢,有时甚至会跳过整个动画(我读过的动画有时是一个...
addToBackStack()与getChildFragmentManager()不兼容
按下返回按钮后,单击按钮时显示的新片段没有关闭,而是关闭了整个应用程序。该按钮位于三个选项卡之一中。 ...
我已经尝试使用commitNow来确保片段事务是同步的。但是,在测试之后,我发现由于某种原因commitNow不会立即删除片段。我有...
FragmentTrasaction问题:IllegalArgumentException:找不到ID的视图
此错误在从活动到片段的片段事务期间发生。我之前做了很多次这个过程,所以我不知道自己缺少什么。我阅读了先前问题的解决方案,但无法...
在FragmentTransaction中使用add()。addToBackStack(),add()。detach()和replace()。addToBackStack()有什么区别?
在Android文档上的FragmentTransaction项目中,描述了方法replace()与为当前视图中添加的所有片段调用方法remove()相同,然后称为...
我想通过一个片段时,被点击活动按钮,以取代ID容器的FrameLayout。我想我已经写了代码工作,但东西是不正确可能是它的布局...
我正在尝试在DialogFragment的子类中添加一个片段。我有一个带有id pref_container的FrameLayout,我想用一个名为settingsFragment的片段替换它。问题是......
我正在制作一个新闻应用程序,其中我有一个片段,其中包含列表中的所有新闻以及另一个包含视频列表的片段。当您触摸新的时,它将从名为的活动中调用方法...
我使用以下方法通过显示/隐藏它们来切换片段(在我的NavigationDrawer中)。 protected void showFragment(int container,Fragment fragment,String tag,String lastTag,...