有关系统在其生命周期内在Android应用程序中转发给组件的事件的问题。大多数组件都有一个强加于它们的特定LifeCycle。此标记不能单独使用:与[tag:android-activity],[tag:android-service],[tag:android-broadcastreceiver]一起使用
我有两个活动,我试图将事件从活动 A 发送到活动 B,而不进入活动 B。 我正在尝试使用粘性事件总线来做到这一点,问题是事件没有触发
如何指定配置更改后应启动哪个Android Activity?
我有两个活动 - LaunchActivity 和 GameActivity。必须先打开LaunchActivity,因为它会使用配置参数启动GameActivity。这工作正常,除了......
我有主活动、主页活动,位于启动器应用程序端(.apk)。 PlayActivity、Profile 和 Init 位于库端 (.aar) 从服务器端将触发 1 条消息,然后我想...
如何仅在来自后台而不是来自其他屏幕或活动时刷新提要?
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 活动,这似乎已经解决了
主题切换后,即使调用 onDestroyView(),片段 UI 仍可通过其他片段可见
这是一个奇怪的事情。我有一个标准应用程序,使用选项卡导航,其中包含一个 MainActivity 和四个 Fragment,每当用户单击底部选项卡时,这些片段就会交换。 这是碎片的方式...
打开可组合项时仅调用一次视图模型函数 - Compose Android
第一次打开撰写屏幕时,我想调用列表api或详细api等函数。 我目前正在使用 LaunchEffect(true) 来调用此类函数,但问题是它是......
如何在 Compose Multiplatform 中使用 Lifecycle?
最近,生命周期库已更新,因此应该可以在 Compose Multiplatform 中使用它。 问题是我无法让它工作。我尝试添加生命周期观察者,但是当我尝试
最近生命周期库已更新,因此应该可以在组合多平台中使用它。 问题是我无法让它工作。我尝试添加生命周期观察者,但是当我尝试...
我正在使用一个有单击的对话框,我想从配置更改中保存单击“onAttach”的监听器,问题是它阻止了我的监听器的覆盖方法
在两个不同片段上从 SharedViewmodel 观察数据无法正常工作
我正在过滤底部表中的数据,该底部表可以在不同活动的两个不同片段中打开,当我过滤片段A上的数据时,它们保存在视图模型上,但是当我进入Fragme时...
我正在尝试为我的屏幕录像机应用程序制作浮动相机视图。 FloatingViewService.java 公共类 FloatingViewService 扩展 LifecycleService 实现 CameraXConfig.Provider,
为什么 Jetpack Compose 中的 @Composable 函数是在 onResume 之后调用的,而不是在 onCreate 之后调用的?
我正在学习如何使用 Jetpack Compose 开发 Android 应用程序,目前正在了解活动生命周期。我注意到一个意外的行为:我的 @Composable 函数是
迁移到 androidx.lifecycle 2.8.0 库时出现编译器错误
我正在使用: 实现 'androidx.lifecycle:lifecycle-extensions:2.2.0' 实现 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0' 注解处理器'androidx.lifecycle:lifecycle-common...
尝试在空对象引用上调用虚拟方法“void androidx.lifecycle.ViewModel.clear()”
因此,在我的应用程序的最后几个版本中,Firebase Crashlytics 报告 androidX 生命周期库中的 ViewModelStore 类崩溃。我使用的生命周期库的版本是2.0.0...
我想在设备收到推送通知时打开反应本机应用程序。 我已经使用此代码打开应用程序,其工作正常,仅低于 Android 10 版本。但不适用于更高版本的 Android 10。 噗...
我正在为我的生命周期范围编写单元测试,但在执行测试时遇到问题。 有人可以告诉我如何适当地模拟生命周期作用域吗? 示例代码: 类 TestFragment : Fragment() { ...
为什么Android Developer文档说明Activity的onDestroy是在ViewModel的onCleared之前调用的?
我使用调试点来弄清楚ViewModel的onCleared和Activity的onDestroy()的顺序。 因为 ComponentActivity 类有下面的代码,我知道 ViewModel 的 onCleared() 被调用,然后
java.lang.IllegalStateException:CompositionLocal LocalLifecycleOwner 不存在
当我收集AsState()或collectAsStateWithLifecycle()时,我收到java.lang.IllegalStateException:CompositionLocal LocalLifecycleOwner not present错误。我不知道出了什么问题。这是以前的
在应用程序之间切换时 Android Activity 会丢失数据
我正在编写我的第一个 Android 应用程序。本质上,它显示并控制直接台球比赛的得分。我读过有关活动生命周期的文章,但仍然有一个我不明白的问题...