【问题标题】:BottomNavigation Menu with Jetpack Navigation causes problems in Android带有 Jetpack Navigation 的 BottomNavigation Menu 会导致 Android 出现问题
【发布时间】:2021-01-10 11:39:37
【问题描述】:

我尝试使用 Jetpack 导航在我的应用中实现 BottomNavigationMenu。我按照本教程https://www.youtube.com/watch?v=pT_4rV3gO78 的每个步骤进行操作,但不幸的是我无法集成到我的应用程序中,并且在启动应用程序时出现错误

java.lang.RuntimeException: Unable to start activity ...

     Caused by: java.lang.NullPointerException: Attempt to read from field 'com.google.android.material.bottomnavigation.BottomNavigationView com.example.td.barapp.databinding.ActivityMainBinding.bottomNavigation' on a null object reference
        at com.example.td.barapp.MainActivity.onCreate(MainActivity.java:28)

错误指向我的主要活动,它具有以下 java 代码:

package com.example.td.barapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import android.os.Bundle;

import com.example.td.barapp.databinding.ActivityMainBinding;


public class MainActivity extends AppCompatActivity  {

   
    private ActivityMainBinding binding;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        DataBaseEntries.createDataBaseEntries(drinksDB);

        NavController navController = Navigation.findNavController(this, R.id.navHostfragment);

        NavigationUI.setupWithNavController(binding.bottomNavigation,navController );


    }
}

所以它说 NavController 是空的。为什么它为空,如何使它不为空?

在这里你可以看到带有 NavHostFragment 的 Main Activity 的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="ExtraText">


    <fragment
        android:id="@+id/navHostfragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        app:labelVisibilityMode="labeled"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorGreen"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/bottom_navigation"
        app:itemIconTint="@color/colorPrimaryDark"
        app:itemTextColor="@color/colorAccent"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

在这里您可以看到 ButtonNavigationMenu 的 XML 文件,其中我将目的地链接到 NavGraph 的 ID (android:id="@+id/FR_LanguageSelection"):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <item
        android:id="@+id/FR_LanguageSelection"
        android:icon = "@drawable/ic_add_circle_full"
        android:title = "Language" />



</menu>

您知道为什么我无法启动应用程序并收到此错误吗?如果没有 JavaCode 中的 BottomNavigationMenu,则应用程序可以正常工作,并且 BottomNavigationView 会正确显示(但我当然不能将其用于导航)。非常感谢您的每一个回答,并非常感谢您的帮助。

【问题讨论】:

  • 你也可以分享你的 nav_graph.xml 吗?
  • 你好 ErfanDP。谢谢你的评论。不幸的是,我不允许分享 NavGraph。有什么我应该考虑的吗?

标签: android android-jetpack bottomnavigationview


【解决方案1】:

当使用数据绑定时,你会以不同的方式使用 setContentView:

binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());

【讨论】:

  • 感谢您的回答多里安。使用您建议的代码时,我收到以下运行时错误:com.example.td.barapp:layout/activity_main: Error inflating class fragment Caused by: android.view.InflateException: Binary XML file line #11 in com.example.td。 barapp:layout/activity_main: 膨胀类片段时出错原因:java.lang.IllegalArgumentException: 二进制 XML 文件第 11 行:重复 id 0x7f0a0110、标签 null 或父 id 0xffffffff 与 androidx.navigation.fragment.NavHostFragment 的另一个片段跨度>
  • 好的,我把所有东西都放在了oncreateView方法中,现在我至少没有得到starting null错误并且可以启动应用程序了。但是,导航不起作用。当我单击 ButtonNavigationBar 的按钮时,没有任何反应
  • 为此,您需要在 menu.xml 中添加更多项目并将片段添加到 navigation.xml。检查您的 ID 是否匹配。而且我还注意到我在答案中漏掉了一行,我刚刚编辑了它
  • 感谢您的回答多里安。我投了赞成票。你能告诉我我必须在导航图中指定什么才能使导航正常工作吗?基本上目前可以在导航图中看到片段,但它们没有链接
  • 网上有几十个关于该实现的教程,这是官方文档:developer.android.com/guide/navigation/…
【解决方案2】:

我的眼睛里有一些东西

-我认为这不是问题,但对于数据绑定,您需要将 XML 文件包装在 &lt;layout&gt; 属性中>

-您需要确保您的菜单项 id 女巫是 FR_LanguageSelection 此处与您的目标片段 id 相同

-您需要使用 nav_graph 中声明的操作进行导航,但此处没有任何内容

检查这些,如果不是,请告诉我

【讨论】:

  • 感谢 ErfanDP 的回答和努力。基本上我不明白你对 的第一点。正如问题中所说,如果没有底部导航的 Java 代码,一切都会正确显示(包括 BottomNavigationMenu),但我无法导航。关于您的第二点,我只是从 navGraph 中复制了 id,所以它是相同的
  • 关于 navGraph 的第三点。基本上我的 NavGraph 有 20 多个条目(因为我使用了 20 多个不同的片段)。没有 BottomNavigationMenu 的导航使用 Jetpack 组件可以正常工作。我应该有一个从 20 个片段中的每个片段到 BottomNavigationView 的目标片段 (FR_LanguageSelection) 的链接吗?
  • @VanessaF 用于生成 DataBinding 类,您需要包装想要使用带有布局属性的数据绑定的整个 XML 片段和活动,这是我相当不完整的项目,但我完全实现了 DataBinding 和 NavCombponent 底部nav 与此您可能会理解我的观点:github.com/ErfanDP/WoocommerceMarket 以我的第一点为例,查看列表 XML 文件并查看在我的单个 Activity 中导航
  • 好的,我把所有东西都放在了oncreateView方法中,现在我至少没有得到starting null错误并且可以启动应用程序了。但是,导航不起作用。当我单击 ButtonNavigationBar 的按钮时,没有任何反应
  • 这是我现在的 onCreateView 方法“public View onCreateView({at}NonNull LayoutInflater inflater, {at}Nullable ViewGroup container, {at}Nullable Bundle savedInstanceState) { binding = ActivityMainBinding.inflate(inflater, container , false); NavController navController = Navigation.findNavController(this, R.id.navHostfragment); NavigationUI.setupWithNavController(binding.bottomNavigation,navController ); return binding.getRoot(); }"
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 2020-09-22
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多