android - NavController 在方向更改时崩溃

标签 android kotlin android-jetpack android-jetpack-navigation

我不确定我在这里做错了什么。简单的设置,带有由内部底部栏控制的 fragment 的单个 Activity ,到目前为止一切都很好。开始 fragment 有一个按钮,里面应该导航到另一个 fragment 。

这是我的 fragment 类中按钮的 onclicklistener:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    add_step_fab.setOnClickListener {
        Navigation.findNavController(view).navigate(R.id.fragmentAtoB)
    }
}

这是我在 navigation.xml 中的操作:
<fragment android:id="@+id/navigation_main" android:name="com.test.test.fragments.AFragment"
          android:label="Fragment A" tools:layout="@layout/fragment_a">
    <action android:id="@+id/fragmentAtoB"
            app:destination="@id/fragmentB" app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim" app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>

导航有效,但我得到了标准
java.lang.IllegalArgumentException: navigation destination com.test.test:id/fragmentAtoB is unknown to this NavController

当我在旋转屏幕、拆分应用程序或有时看似随机的情况下单击按钮时出现错误。好像和配置变化有关?

编辑:
我也尝试过使用
val clickListener: View.OnClickListener = Navigation.createNavigateOnClickListener(R.id.fragmentAtoB)
    add_step_fab.setOnClickListener(clickListener)

与上述相同的问题。

检查我是否实际上在同一个 fragment 中,正如一些为有相同异常(但出于不相关原因)的用户所建议的那样,例如:
if (controller.currentDestination?.id == R.id.navigation_main) {
            controller.navigate(R.id.fragmentAtoB)
        }

也没有帮助。

最佳答案

在应用程序正常运行几个月后,我最近也遇到了这种情况。我最初将导航添加到使用“MainActivity”类的应用程序,然后从菜单启动其他 Activity (而不是让导航组件在单个 Activity 的 fragment 之间导航)。

因此,应用程序的组织方式使得 MainActivity 是“中心”,菜单选项中的选择会导致启动其他 Activity ,当用户从它们返回时,它们会回到 MainActivity - 所以一个纯粹的“中心 (MainActivity) 和发言(5 项其他 Activity )”模型。

在 MainActivity.onCreate() 中称为 setupNavigation() 方法,最初看起来像:

private void setupNavigation() {
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    drawerLayout = findViewById(R.id.drawer_layout);

    // This class implements the listener interface for the NavigationView, handler is below.
    NavigationView navigationView = findViewById(R.id.nav_view);
    navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout);
    NavigationUI.setupWithNavController(navigationView, navController);

    // MainActivity implements the listener for navigation events
    navigationView.setNavigationItemSelectedListener(this);

}

正如我所提到的,即使在最近发生配置更改时,它也能正常工作。即使只是将 MainActivity 上的配置从纵向更改为横向也会导致异常:
ComponentInfo{com.reddragon.intouch/com.reddragon.intouch.ui.MainActivity}: java.lang.IllegalStateException: You must call setGraph() before calling getGraph()

我发现我必须添加这一行:
navController.setGraph(R.navigation.nav_host);

在 Naviation.findNavController() 调用之后,它就可以很好地处理配置更改。

关于android - NavController 在方向更改时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527017/

相关文章:

java - 如果我们使用基于单一 Activity 的架构,View Model 可能会很重

android - 使用 View 绑定(bind)时如何解决 'data binding is not enabled' 错误

java - 即使我正在调用 thread.interrupt() 线程也不会中断

android - 我正在尝试在 imageview 中查看 webp 图像,它的大小低于 200kb。但它显示溢出错误

java - 房间 : @Embedded vs @TypeConverters

kotlin - 如何在 Gradle 构建中使用来自 Kotlin 的孵化 Vector API?

android - 运行 Android Studio Default **Map Application** 时出错

android - 如何从另一个应用程序启动 Android Activity?

android - 如何强制 Jacoco 在 Gradle 中使用特定版本

android - 如何在 Android Jetpack Compose 的 MaterialTheme 中添加额外的颜色?