Я создал приложение для Android и добавил «Действие ящика навигации» из галереи, я удалил и переименовал пункты меню. После запуска приложения, когда я нажимаю на любой элемент меню в активности Drawer, я получаю следующую ошибку:
java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()' on a null object reference
at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.java:78)
at androidx.navigation.ui.NavigationUI$3.onNavigationItemSelected(NavigationUI.java:453)
at com.google.android.material.navigation.NavigationView$1.onMenuItemSelected(NavigationView.java:215)
at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)
at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)
at com.google.android.material.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:416)
at android.view.View.performClick(View.java:7448)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Код основной деятельности:
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var navView: NavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initView()
}
private fun initView() {
setContentView(R.layout.activity_main)
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
initFab()
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
navView = findViewById(R.id.main_nav_view)
val navController = findNavController(R.id.nav_host_fragment)
navView.setNavigationItemSelectedListener(this)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_category_list
),
drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
private fun initFab() {
val fab: FloatingActionButton = findViewById(R.id.fab)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
}
...
}
значения-ночь/themes.xml:
<resources xmlns:tools = "http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name = "Theme.MyMenuApplication" parent = "Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name = "colorPrimary">@color/purple_200</item>
<item name = "colorPrimaryVariant">@color/purple_700</item>
<item name = "colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name = "colorSecondary">@color/teal_200</item>
<item name = "colorSecondaryVariant">@color/teal_200</item>
<item name = "colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name = "android:statusBarColor" tools:targetApi = "l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
значения/themes.xml:
<resources xmlns:tools = "http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name = "Theme.MyMenuApplication" parent = "Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name = "colorPrimary">@color/purple_500</item>
<item name = "colorPrimaryVariant">@color/purple_700</item>
<item name = "colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name = "colorSecondary">@color/teal_200</item>
<item name = "colorSecondaryVariant">@color/teal_700</item>
<item name = "colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name = "android:statusBarColor" tools:targetApi = "l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name = "Theme.MyMenuApplication.NoActionBar">
<item name = "windowActionBar">false</item>
<item name = "windowNoTitle">true</item>
</style>
<style name = "Theme.MyMenuApplication.AppBarOverlay" parent = "ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name = "Theme.MyMenuApplication.PopupOverlay" parent = "ThemeOverlay.AppCompat.Light" />
</resources>
Навигация:
<?xml version = "1.0" encoding = "utf-8"?>
<navigation xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:id = "@+id/main_navigation"
app:startDestination = "@+id/nav_category_list">
<fragment
android:id = "@+id/nav_category_list"
android:name = "hu.myapp.activity.main.fragment.category.CategoryFragment"
android:label = "@string/fragment_category_item_list_title"
tools:layout = "@layout/fragment_category_item_list" />
</navigation>
Меню:
<?xml version = "1.0" encoding = "utf-8"?>
<menu xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
tools:showIn = "navigation_view">
<group android:checkableBehavior = "single">
<item
android:id = "@+id/nav_category_list"
android:icon = "@drawable/ic_account_balance_24"
android:title = "@string/menu_accounts"
/>
</group>
</menu>
Окно отладки:
Что может вызвать исключение NullpointerException в androidx.navigation.NavGraph androidx.navigation.NavDestination.getParent()?
Соответствуют ли идентификаторы пунктов вашего меню идентификаторам на графике?
попробуй понизить реализацию навигации, в 2.3.2 что-то не так
implementation 'androidx.navigation:navigation-fragment:2.3.1'
implementation 'androidx.navigation:navigation-ui:2.3.1'
этот ответ решил мою проблему, но мне было интересно, как вы пришли к такому ответу. Я имею в виду, вы нашли это в документах и примечаниях к выпуску или где-то еще... Мне просто любопытно
моя версия ktx 2.5.1, и это решение в 2022 году все еще работало. Я не знаю, почему андроид-студия такая глючная.
Я решил, что в моем приложении тега фрагмента: navGraph отсутствовал (в макете). Я добавил его, и это решило исключение нулевого указателя.
<fragment
android:id = "@+id/nav_host_fragment"
android:name = "androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost = "true"
...
app:navGraph = "@navigation/main_navigation"/>
Я получил эту ошибку из-за наличия двух разных NavController в моей иерархии компоновки в результате наличия компонуемого с параметром navController:
navController: NavController = rememberNavController()
, но не устанавливая его на общий navController с одним корнем.
Привет Дэн, я думаю, что у меня такая же проблема. Что вы имеете в виду, устанавливая для него общий единый корневой navController? Что ты написал? :)
Я использовал navController = rememberNavController()
вверх в setContent {
, но каким-то образом я оказался с другим navController внизу, забыв передать navController компонуемой функции. Зарегистрируйте свои экземпляры navController и убедитесь, что они являются одним и тем же экземпляром. Если они все одинаковые, то у вас другая проблема.
Я получил это, потому что я установил popUpTo в свой первый фрагмент, а также обработал popBackStack onBackPressed.
я имел
app:launchSingleTop = "true"
в моем действии
<action
android:id = "@+id/action_confirmation_to_home_page"
app:destination = "@id/nav_graph_home"
app:launchSingleTop = "true"
app:popUpTo = "@id/home_page_fragment"
app:popUpToInclusive = "true" />
я удалил его и проблема ушла
У меня такая же проблема Я забыл инициализировать переменную navController в классе фрагмента.
private NavController navController;
Так что я добавляю в свой onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
navController = Navigation.findNavController(view);
пожалуйста, поделитесь навигационной схемой