在onResume

时间:2017-11-12 04:49:23

标签: android android-fragments

在我的项目中,我只使用一个Activity,所有的屏幕都是通过片段实现的。我的Activity只控制fragment导航,权限处理,显示提醒对话等内容。 我经常遇到这种情况。问题是,在上述所有情况下,如同请求许可,显示提醒等,ActivityFragment将转到onPause,如果我在此操作后立即转到Fragment Transaction。我转到另一个屏幕,这意味着如果我执行ActivityonPause仍然会处于Activity状态,这将导致崩溃。我必须等到resume进入resume州。 一个用例是,在启动画面中,我要求权限。在询问权限后,如果允许,我必须启动主屏幕,这是另一个片段。因此,在权限回调后执行的下一个代码是片段事务,并且由于权限要求dialog返回到Activity,因此活动需要一些时间才能返回fragment transactiononActivityResult,我必须等待一段时间才能执行IllegalStateException

catch发生时的情况也是如此。 目前我正在快速解决这个问题。我将一个runnable作为成员保存在Activity中,这是片段事务可运行的。我会尝试捕获onResume并在onActivityResult我将片段事务分配给Runnable。并且每次在活动onResume中,如果Runnable不为null,我只是执行它。 同样适用于if let audioAssetTrack = videoAsset.tracks(withMediaType: .audio).first { try audioTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipDuration), of: audioAssetTrack, at: insertTime) if video.shouldMute { audioMixInputParams.setVolumeRamp(fromStartVolume: 0.0, toEndVolume: 0.0, timeRange: CMTimeRangeMake(insertTime, clipDuration)) } else { audioMixInputParams.setVolumeRamp(fromStartVolume: 1.0, toEndVolume: 1.0, timeRange: CMTimeRangeMake(insertTime, clipDuration)) } } 。结果我将保留在一个成员中并传递给Activity belongs_to中的片段。 但我认为这不是一个好习惯。代码看起来很丑,因为在Activity中使用了这么多成员来处理这个错误。 有没有什么好方法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以通过将片段事务与状态丢失

一起提交来解决此问题
supportFragmentManager.beginTransaction()
                      .replace(R.id.fragment_holder, new Fragment())
                      .commitAllowingStateLoss()

但是如果你想保留片段的状态,你就不应该在调用onSaveInstanceState之后进行片段交易。