Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 导航控制器在方向改变时崩溃_Android_Kotlin_Android Jetpack_Android Jetpack Navigation - Fatal编程技术网

Android 导航控制器在方向改变时崩溃

Android 导航控制器在方向改变时崩溃,android,kotlin,android-jetpack,android-jetpack-navigation,Android,Kotlin,Android Jetpack,Android Jetpack Navigation,我真的不确定我做错了什么。简单的设置,单个活动的片段由内部的底部栏控制,到目前为止还不错。开始片段中有一个按钮,可以导航到另一个片段 下面是我的fragment类中按钮的onclicklistener: override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) add_step_fab.setOnClickL

我真的不确定我做错了什么。简单的设置,单个活动的片段由内部的底部栏控制,到目前为止还不错。开始片段中有一个按钮,可以导航到另一个片段

下面是我的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>
在旋转屏幕、拆分应用程序或有时看起来是随机的情况下单击按钮时出错。看起来这和配置的改变有关

编辑: 我也试过使用

val clickListener: View.OnClickListener = Navigation.createNavigateOnClickListener(R.id.fragmentAtoB)
    add_step_fab.setOnClickListener(clickListener)
与上述问题相同

检查我是否真的在同一个片段中,正如一些人为具有相同异常的用户所建议的那样(但由于不相关的原因),例如:

if (controller.currentDestination?.id == R.id.navigation_main) {
            controller.navigate(R.id.fragmentAtoB)
        }

也没有帮助。

配置更改后,片段或活动暂时超出范围,然后执行onResume()覆盖。如果您有任何在onCreate()或onViewCreated()中初始化的变量,那么这些变量可能已超出范围,现在为空值。因此,我通常有一个名为RestoreAll()的方法,负责实例化代码使用的所有对象,我从onResume()调用此方法,以便每次更改配置时,都会重新实例化所有本地对象。

更改配置后,nav controller backstack出现问题。试试这个:

在一个应用程序正常运行数月后,我最近也经历了这种情况。我最初在一个应用程序中添加了导航功能,该应用程序使用“MainActivity”类,然后会从菜单启动其他活动(而不是让导航组件在单个活动的片段之间导航)

因此,应用程序的组织方式使得MainActivity成为“中心”,菜单选项中的选项会导致启动其他活动,当用户从中返回时,他们会回到MainActivity——这是一个纯粹的“中心(MainActivity)和辐射(5个其他活动)”模型

在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()调用之后,它就可以很好地处理配置更改。

必须有一种方法可以通过jetpack tho以生命周期感知的方式处理onclick?毕竟,大多数jetpack架构组件的全部前提是停止考虑片段和活动生命周期。我们必须等待更熟悉jetpack架构的人的消息。我在我所有的应用程序开发中都使用了这种保险方法,从那以后就没有出现过任何问题。因此,我只是查看了一些示例,它们与oncreateview中的导航非常配合。这里发生了一些非常奇怪的事情,所以我想明天我会用更多的代码来悬赏使用Android ViewModel,而不是使用导航文件的
setGraph
方法也为我解决了这个问题!是的,如果在ViewPager()的一个页面内进行导航,这确实是一个解决方案。Thanx!!“就在Naviation.findNavController()调用之后,它处理了配置更改。”-这是正确的!!!
navController.setGraph(R.navigation.nav_host);