int*_*thy 1 android android-fragments
我正在开发带有片段的应用程序。它具有一个JavaScript接口,该接口在Main Activity中调用,并且具有片段替换逻辑。当应用程序在前台时,一切正常,但是当应用程序在后台时,片段事务替换不起作用。当我返回到我的应用程序时,我仍然看到旧的片段,而看不到新的片段。
@JavascriptInterface
public void beginCall(String toast) {
FragmentTransaction fTrans;
taskFragment = TaskFragment.newInstance(toast,"");
fTrans = getSupportFragmentManager().beginTransaction();
fTrans.replace(R.id.frgmCont, taskFragment);
fTrans.commit();
}
Run Code Online (Sandbox Code Playgroud)
怎么了?为什么片段事务在后台不起作用?
一段时间后,我找到了答案:在onStop之后无法执行片段事务,它将导致java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作。我没有得到该异常,因为JavascriptInterface是在单独的线程中执行的。当我强迫我的代码在主线程中运行时,出现了该错误。因此,我需要使用一些活动生命周期方法来实现不同的逻辑,或者切换到多个活动逻辑。希望我的回答对任何人有帮助。
某些用例或架构可能需要在应用程序处于后台时触发片段事务。
我们创建了以下扩展函数:
fun FragmentTransaction.commitWhenStarted(lifecycle: Lifecycle) {
lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(value = Lifecycle.Event.ON_START)
fun onStart() {
lifecycle.removeObserver(this)
commit()
}
})
}
Run Code Online (Sandbox Code Playgroud)
就像任何其他版本的 commit、commitNow、commitAllowingStateLoss 一样使用它。如果活动状态至少已经启动,则将直接调用观察者并执行片段事务。如果事务在 childFragmentManager 上执行,则可以从 Activity 或 Fragment 获取生命周期
transaction.commitWhenStarted(lifecycle)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |