Android 导航目标_名称对此NavController未知,是否重新打开以前使用NavController.popBackStack()关闭的片段?
我正在我的应用程序中使用导航组件,最近它工作正常,但在将项目更新为Android 导航目标_名称对此NavController未知,是否重新打开以前使用NavController.popBackStack()关闭的片段?,android,android-architecture-components,android-jetpack,android-architecture-navigation,Android,Android Architecture Components,Android Jetpack,Android Architecture Navigation,我正在我的应用程序中使用导航组件,最近它工作正常,但在将项目更新为AndroidX后,我收到错误导航目的地\u此导航控制器不知道该目的地的名称(我将打开该目的地)以前使用navController.popBackStack()从自身关闭。另外,如果我从MainActivity关闭目标片段,则不会出现错误,但只有当使用popBackStack从自身关闭目标片段时,才会出现错误。如下 目的片段 主要活动 我也检查了相关问题,但没有帮助 注意:我使用的是最新版本的导航库(alpha05)以前的值可能仍
AndroidX
后,我收到错误导航目的地\u此导航控制器不知道该目的地的名称
(我将打开该目的地)以前使用navController.popBackStack()
从自身关闭。另外,如果我从MainActivity
关闭目标片段,则不会出现错误,但只有当使用popBackStack
从自身关闭目标片段时,才会出现错误。如下
目的片段
主要活动
我也检查了相关问题,但没有帮助
注意:我使用的是最新版本的导航库(alpha05)以前的值可能仍然存在于视图模型中,并且正在立即触发。我建议使用一个界面来处理后退按钮委托,而不是使用观察者。这应该可以解决这个问题 发生的情况是,您在后堆栈中弹出的位置太远,以至于不再有活动图形。这是因为你的观察者被触发的频率比它应该的要高。要了解这一点,我建议在崩溃之前调试该行并检查图形。它很可能是空的。我在DestinationFragment中使用它来观察MainActivity的反压,因为我在问题中已经提到了这一点。所以问题出在
SingleLiveEvent
中,我注意到我不小心将fun-observe(所有者:生命周期所有者,观察者:观察者)的代码更改为
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, observer)//Here is problem I was calling super twice in function
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
现在我的代码运行良好我也遇到了同样的问题。在我的应用程序中有三个片段A->B->C
,我必须从C
返回A
。在我的例子中,我使用了popBackStack()
关闭当前片段并返回到上一个片段,在此之后,任何从A
抛出的Navigation xxx导航的尝试对此NavController
异常是未知的
我最终使用navigate()
到A
而不是从后堆栈中弹出片段。使用popUpTo
和popuptinclusive
设置正确修复了问题(参见文档)
我用这种方式
@Override
public void onBackPressed() {
if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
/** do something */
else myNavController.popBackStack();
}
我用的是只触发一次的
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, observer)//Here is problem I was calling super twice in function
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
<fragment
android:id="@+id/FragmentC"
android:name="xxx.FragmentC"
android:label="C" >
<action
android:id="@+id/action_to_A"
app:destination="@id/FragmentA"
app:popUpTo="@+id/FragmentA"
app:popUpToInclusive="true" />
</fragment>
@Override
public void onBackPressed() {
if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
/** do something */
else myNavController.popBackStack();
}