主 Activity 没有 NavController

Ник*_*пов 1 java navigation android android-fragments android-studio

在应用程序的一次启动期间,日志发出了这样的一堆错误:

\n
E/AndroidRuntime: FATAL EXCEPTION: main\nProcess: com.nikitafront.schooldiary, PID: 29751\njava.lang.RuntimeException: Unable to start activity ComponentInfo{com.nikitafront.schooldiary/com.nikitafront.schooldiary.MainActivity}: java.lang.IllegalStateException: Activity com.nikitafront.schooldiary.MainActivity@4801345 does not have a NavController set on 2131296534\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3754)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3912)\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319)\n    at android.os.Handler.dispatchMessage(Handler.java:106)\n    at android.os.Looper.loop(Looper.java:239)\n    at android.app.ActivityThread.main(ActivityThread.java:8205)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016)\n Caused by: java.lang.IllegalStateException: Activity com.nikitafront.schooldiary.MainActivity@4801345 does not have a NavController set on 2131296534\n    at androidx.navigation.Navigation.findNavController(Navigation.java:61)\n    at com.nikitafront.schooldiary.MainActivity.onCreate(MainActivity.java:53)\n    at android.app.Activity.performCreate(Activity.java:8119)\n    at android.app.Activity.performCreate(Activity.java:8103)\n    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1359)\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3727)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3912)\xc2\xa0\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\xc2\xa0\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:106)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:239)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:8205)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1016)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

在此之前,我只是尝试应用程序主题,但在我将所有内容恢复到原始状态后,一切都没有改变

\n

PS我尝试通过清除缓存并重新启动IDE来解决问题,但这种方法也不起作用。

\n

MainActivity.java代码

\n
package com.nikitafront.schooldiary;\n\nimport android.content.res.Configuration;\nimport android.graphics.Canvas;\nimport android.graphics.ColorFilter;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.view.Window;\nimport android.widget.CheckBox;\nimport android.widget.LinearLayout;\nimport android.widget.RadioButton;\nimport android.widget.Spinner;\n\nimport com.google.android.material.bottomnavigation.BottomNavigationView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.content.ContextCompat;\nimport androidx.fragment.app.Fragment;\nimport androidx.navigation.NavController;\nimport androidx.navigation.Navigation;\nimport androidx.navigation.fragment.NavHostFragment;\nimport androidx.navigation.ui.AppBarConfiguration;\nimport androidx.navigation.ui.NavigationUI;\n\nimport com.nikitafront.schooldiary.databinding.ActivityMainBinding;\n\npublic class MainActivity extends AppCompatActivity {\n\nprivate ActivityMainBinding binding;\nprivate CheckBox checkBoxAuto;\nprivate Spinner dropDownList;\nprivate LinearLayout byHandLesson;\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n\n    binding = ActivityMainBinding.inflate(getLayoutInflater());\n    setContentView(binding.getRoot());\n\n    BottomNavigationView navView = findViewById(R.id.nav_view);\n    // Passing each menu ID as a set of Ids because each\n    // menu should be considered as top level destinations.\n    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(\n            R.id.nav_write, R.id.nav_do, R.id.nav_account)\n            .build();\n\n\n    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);\n    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);\n    NavigationUI.setupWithNavController(binding.navView, navController);\n\n\n    checkBoxAuto = (CheckBox) findViewById(R.id.checkBoxAuto);\n    dropDownList = (Spinner) findViewById(R.id.dropDownListLesson);\n    byHandLesson = (LinearLayout) findViewById(R.id.byHandLesson);\n\n}\n\n@Override\nprotected void onStart() {\n    super.onStart();\n    checkBoxAuto.setOnClickListener(this::selectFillLesson);\n\n    int currentNightMode = getApplicationContext().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;\n\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && currentNightMode == Configuration.UI_MODE_NIGHT_YES) {\n        getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.my_black));\n    }\n}\n\npublic void selectFillLesson(View view) {\n    if (checkBoxAuto.isChecked()) {\n        byHandLesson.setAlpha((float) 0.7);\n    } else {\n        byHandLesson.setAlpha((float) 1);\n    }\n    dropDownList.setEnabled(!(checkBoxAuto.isChecked()));\n}\n\npublic void selectCheckBox(View view) {\n    checkBoxAuto.setChecked(!checkBoxAuto.isChecked());\n    selectFillLesson(checkBoxAuto);\n}\n\npublic void addHomework(View view) {\n\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

main_activity.xml代码

\n
<?xml version="1.0" encoding="utf-8"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nandroid:id="@+id/container"\nandroid:layout_width="match_parent"\nandroid:layout_height="match_parent">\n\n<com.google.android.material.bottomnavigation.BottomNavigationView\n    android:id="@+id/nav_view"\n    android:layout_width="0dp"\n    android:layout_height="wrap_content"\n    app:layout_constraintBottom_toBottomOf="parent"\n    app:layout_constraintLeft_toLeftOf="parent"\n    app:layout_constraintRight_toRightOf="parent"\n    app:menu="@menu/bottom_nav_menu" />\n\n<androidx.fragment.app.FragmentContainerView\n    android:id="@+id/nav_host_fragment_activity_main"\n    android:name="androidx.navigation.fragment.NavHostFragment"\n    class="androidx.navigation.fragment.NavHostFragment"\n    android:layout_width="match_parent"\n    android:layout_height="match_parent"\n    app:defaultNavHost="true"\n    app:layout_constraintBottom_toTopOf="@id/nav_view"\n    app:layout_constraintLeft_toLeftOf="parent"\n    app:layout_constraintRight_toRightOf="parent"\n    app:layout_constraintTop_toTopOf="parent"\n    app:navGraph="@navigation/mobile_navigation" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n
Run Code Online (Sandbox Code Playgroud)\n

Manifest.xml代码

\n
<?xml version="1.0" encoding="utf-8"?>\n<manifest xmlns:android="http://schemas.android.com/apk/res/android"\npackage="com.nikitafront.schooldiary">\n\n<application\n    android:allowBackup="true"\n    android:icon="@drawable/homework_icon"\n    android:label="@string/app_name"\n    android:roundIcon="@drawable/homework_icon"\n    android:supportsRtl="true"\n    android:theme="@style/Theme.SchoolDiary">\n    <activity\n        android:name=".MainActivity"\n        android:label="@string/app_name">\n        <intent-filter>\n            <action android:name="android.intent.action.MAIN" />\n\n            <category android:name="android.intent.category.LAUNCHER" />\n        </intent-filter>\n    </activity>\n</application>\n
Run Code Online (Sandbox Code Playgroud)\n\n

小智 9

正如参考文献中所述:

使用 FragmentContainerView 创建 NavHostFragment 或通过 FragmentTransaction 手动将 NavHostFragment 添加到 Activity 时,尝试通过 Navigation.findNavController(Activity, @IdRes int) 在 Activity 的 onCreate() 中检索 NavController 将失败。您应该直接从 NavHostFragment 检索 NavController。

看起来你应该使用

NavHostFragment navHostFragment =
        (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();
Run Code Online (Sandbox Code Playgroud)

代替

 NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);
Run Code Online (Sandbox Code Playgroud)