在使用 BottomNavigationView + NavHostFragment 当中出现的一些问题

在使用 BottomNavigationView + NavHostFragment 当中出现的一些问题

新建项目后我尝试上手Google推荐的底部导航控件与NavHostFragment进行联动,在此期间出现了两个小问题:

  • 在进行 NavigationUI.setupActionBarWithNavController() 时,出现了 setTitle() 空指针的问题。
  • 在进行 NavigationUI.setupWithNavController() 时,出现了 BottomNavigationView点击无效 的问题
  • 出现 cannot use the same id as the graph NavGraph 报错闪退

记录一下如何解决:

  • setTitle() 空指针
java.lang.RuntimeException: Unable to start activity ComponentInfo{
    
    com.mz.demo/com.mz.demo.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3639)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3796)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2214)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
        at androidx.navigation.ui.ActionBarOnDestinationChangedListener.setTitle(ActionBarOnDestinationChangedListener.java:48)
        at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:103)
        at androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:233)
        at androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(NavigationUI.java:237)
        at com.mz.demo.MainActivity.onCreate(MainActivity.java:33)
        at android.app.Activity.performCreate(Activity.java:8051)
        at android.app.Activity.performCreate(Activity.java:8031)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3612)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3796) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2214) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7842) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

这个问题我百度了半天,大部分解决答案都是说是因为 theme继承了NoActionBar 。导致了Actionbar为空。我当时想自己根本没有改theme当中当中的代码,绝对不可能是这个问题,继续翻度娘。结果一个上午过去,还是没有找到问题所在。我最后摆烂一翻theme文件,结果是因为它自己生成了一个无标题的主题并且在activity当中应用上去了。

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Smart_City_0524" 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>
    
    //它自己生成的,并且在Manifest文件当中引用了
    <style name="Theme.Smart_City_0524.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="Theme.Smart_City_0524.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="Theme.Smart_City_0524.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

那么问题就解决了,删掉清单文件当中的theme引用 或者 更改这个主题样式为含有ActionBar的即可。

  • BottomNavigationView 点击无效

在软件运行起来之后,点击BottomNavigationView的选项时只有水波纹效果,被点击的选项没有被选中,并且页面也未切换。

想要底部导航与NavHostFragment联动有一个额外关注的点,即 你的 navigation文件当中fragment的id 必须与 BottomNavigation使用的menu文件当中的item的id 一致

  • 出现 cannot use the same id as the graph NavGraph 报错 闪退
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.abbas.smart_city_0524, PID: 2878
    java.lang.RuntimeException: Unable to start activity ComponentInfo{
    
    com.abbas.smart_city_0524/com.abbas.smart_city_0524.ui.MainActivity}: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class fragment
     Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class fragment
     Caused by: java.lang.RuntimeException: Exception inflating com.abbas.smart_city_0524:navigation/mobile_navigation line 2
        at androidx.navigation.NavInflater.inflate(NavInflater.java:97)
        at androidx.navigation.NavController.setGraph(NavController.java:557)
        at androidx.navigation.NavController.setGraph(NavController.java:539)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:248)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:140)
        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:319)
        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:298)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:699)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195)
        at com.abbas.smart_city_0524.base.BaseActivity.onCreate(BaseActivity.java:19)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.IllegalArgumentException: Start destination 2131231006 cannot use the same id as the graph NavGraph(com.abbas.smart_city_0524:id/navigation_home) startDestination=0x0
        at androidx.navigation.NavGraph.setStartDestination(NavGraph.java:286)
E/AndroidRuntime:     at androidx.navigation.NavGraph.onInflate(NavGraph.java:66)
        at androidx.navigation.NavInflater.inflate(NavInflater.java:110)
        at androidx.navigation.NavInflater.inflate(NavInflater.java:88)
        	... 32 more

这个情况也是出现的我很奇怪,百度了半天也找到类似的解决办法,结果仔细看了一下navigation文件的id,发现 根布局 navigation 标签的id与其中某一个 fragment 标签的id一致了

人家不犯的错我犯了,哭死

猜你喜欢

转载自blog.csdn.net/qq_49757305/article/details/124967033
今日推荐