引起原因:java.lang.ClassCastException:androidx.fragment.app.FragmentContainerView无法转换为androidx.navigation.fragment.NavHostFragment

5 mobile android kotlin

我的导航控制器中出现此错误,我已经更改了 XML 中的声明,但没有帮助,我更改了 FragmenContainer 的 Fragment 但没有帮助。谁能帮助我解决这个错误?

\n

日志:

\n
E/AndroidRuntime: FATAL EXCEPTION: main\nProcess: com.example.pokedex, PID: 22784\njava.lang.RuntimeException: Unable to start activity \nComponentInfo{com.example.pokedex/com.example.pokedex.ui.main.MainActivity}: \njava.lang.ClassCastException: androidx.fragment.app.FragmentContainerView cannot be cast to \nandroidx.navigation.fragment.NavHostFragment\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)\n    at android.app.ActivityThread.-wrap11(Unknown Source:0)\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)\n    at android.os.Handler.dispatchMessage(Handler.java:106)\n    at android.os.Looper.loop(Looper.java:169)\n    at android.app.ActivityThread.main(ActivityThread.java:6521)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)\n Caused by: java.lang.ClassCastException: androidx.fragment.app.FragmentContainerView cannot be cast \nto androidx.navigation.fragment.NavHostFragment\n    at com.example.pokedex.ui.main.MainActivity.onCreate(MainActivity.kt:48)\n    at android.app.Activity.performCreate(Activity.java:7051)\n    at android.app.Activity.performCreate(Activity.java:7042)\n    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)\xc2\xa0\n    at android.app.ActivityThread.-wrap11(Unknown Source:0)\xc2\xa0\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:106)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:169)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:6521)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

主要活动:

\n
class MainActivity : AppCompatActivity() {\n\nprivate lateinit var toggle: ActionBarDrawerToggle\nvar currentPath: String? = null\nval TAKE_PICTURE = 1\nval SELECT_PICTURE = 2\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.main_activity)\n    configBottomNavegacao()\n    configNavDrawer()\n\n    main_activity_bottom_navigation.setupWithNavController(pokemons_activity_nav_host.findNavController())\n\n    toggle = ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close )\n    drawerLayout.addDrawerListener(toggle)\n    toggle.syncState()\n\n    supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n    navView.setNavigationItemSelectedListener {\n        when(it.itemId){\n            R.id.drawer_camera -> dispatchCameraIntent()\n            R.id.drawer_fav -> dispatchFavoritosIntent()\n        }\n        true\n    }\n}\n\nprivate fun dispatchFavoritosIntent() {\n}\n\nprivate fun configNavDrawer() {\n    val navHostFragment = supportFragmentManager\n        .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment\n    val navController = navHostFragment.navController\n\n    // verifica onde vai ou nao mostrar o drawer\n    navController.addOnDestinationChangedListener { controller, destination, arguments ->\n        when(destination.id){\n            R.id.listaPokemons -> mostraNavDrawer()\n            R.id.listaFavPokemons -> mostraNavDrawer()\n            R.id.search -> mostraNavDrawer()\n            R.id.detalhesPokemons -> mostraNavDrawer()\n        else -> ocultaNavDrawer()\n        }\n    }\n}\n\nprivate fun mostraNavDrawer() {\n    navView.visibility = View.VISIBLE\n}\nprivate fun ocultaNavDrawer(){\n    navView.visibility = View.GONE\n}\n\nprivate fun configBottomNavegacao() {\n    val navHostFragment = supportFragmentManager\n        .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment\n    val navController = navHostFragment.navController\n\n    // verifica onde vai ou nao mostrar o bottom navigation\n    navController.addOnDestinationChangedListener { controller, destination, arguments ->\n        when(destination.id){\n            R.id.listaPokemons -> mostraBottomNav()\n            R.id.listaFavPokemons -> mostraBottomNav()\n            R.id.search -> mostraBottomNav()\n            R.id.detalhesPokemons -> mostraBottomNav()\n            else -> ocultaBottomNavigation()\n        }\n\n    }\n\n}\n\n//oculta o botao de navega\xc3\xa7ao\nprivate fun ocultaBottomNavigation() {\n    main_activity_bottom_navigation.visibility = View.GONE\n}\n\n// exibe o botao de navega\xc3\xa7ao\nprivate fun mostraBottomNav() {\n    main_activity_bottom_navigation.visibility = View.VISIBLE\n}\n
Run Code Online (Sandbox Code Playgroud)\n

主要 XML:

\n
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nxmlns:tools="http://schemas.android.com/tools"\nandroid:id="@+id/drawerLayout"\nandroid:layout_width="match_parent"\nandroid:layout_height="match_parent"\ntools:context=".ui.main.MainActivity">\n\n<androidx.fragment.app.FragmentContainerView\n    android:id="@+id/pokemons_activity_nav_host"\n    class="androidx.navigation.fragment.NavHostFragment"\n    android:layout_width="match_parent"\n    android:layout_height="match_parent"\n    app:defaultNavHost="true"\n    app:navGraph="@navigation/nav_graph" />\n\n<androidx.constraintlayout.widget.ConstraintLayout\n    android:layout_width="match_parent"\n    android:layout_height="match_parent">\n\n    <com.google.android.material.bottomnavigation.BottomNavigationView\n        android:id="@+id/main_activity_bottom_navigation"\n        android:layout_width="0dp"\n        android:layout_height="wrap_content"\n        android:layout_marginStart="0dp"\n        android:layout_marginEnd="0dp"\n        android:background="@color/bottomNavigation"\n        app:layout_constraintBottom_toBottomOf="parent"\n        app:layout_constraintLeft_toLeftOf="parent"\n        app:layout_constraintRight_toRightOf="parent"\n        app:menu="@menu/botao_nav_menu" />\n\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n\n<com.google.android.material.navigation.NavigationView\n    android:layout_width="wrap_content"\n    android:layout_height="match_parent"\n    android:id="@+id/navView"\n    app:headerLayout="@layout/nav_header"\n    app:menu="@menu/nav_drawer_menu"\n    android:layout_gravity="start"\n    android:fitsSystemWindows="true"/>\n\n</androidx.drawerlayout.widget.DrawerLayout>\n
Run Code Online (Sandbox Code Playgroud)\n

单击时,错误被拉到该行:main_activity_bottom_navigation.setupWithNavController(pokemons_activity_nav_host.findNavController())

\n

我找不到解决方案,有人可以帮助我吗?

\n

NRU*_*ANA 4

navController在设置之前您应该先获取。像下面这样:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
configBottomNavegacao()
configNavDrawer()

val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment
val navController = navHostFragment.navController

// Now set the navController----------------------------------------
  main_activity_bottom_navigation.setupWithNavController(navController )


toggle = ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close )
drawerLayout.addDrawerListener(toggle)
toggle.syncState()

supportActionBar?.setDisplayHomeAsUpEnabled(true)

navView.setNavigationItemSelectedListener {
    when(it.itemId){
        R.id.drawer_camera -> dispatchCameraIntent()
        R.id.drawer_fav -> dispatchFavoritosIntent()
    }
    true
  }
}
Run Code Online (Sandbox Code Playgroud)