使用 BottomNavigation 未知的 NavController 目的地

NavController destination unknown using BottomNavigation

我在主菜单中使用 BottomNavigation class 在主屏幕中循环浏览 Fragments。奇怪的是我的应用程序崩溃了,因为 NavController 在四个片段之一中找不到目的地。 MainMenuFragment 与 MainMenu 不同(activity 包含片段和 NavHostFragment)。知道为什么会这样吗?

导航图:http://prntscr.com/pcfufk

Activity (MainMenu.java) 屏幕 http://prntscr.com/pcgcnv

在MainMenu.java中:

private BottomNavigationView.OnNavigationItemSelectedListener listener = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            Bundle args = new Bundle();
            switch (menuItem.getItemId()) {
                case R.id.addorder:
                    args.putString("UID", UID);
                    controller.navigate(R.id.action_mainMenuFragment_to_addOrderFragment, args);
                    break;
                case R.id.addcust:
                    bundle.putString("UID", UID);
                    controller.navigate(R.id.action_mainMenuFragment_to_addCustomerFragment);
                    break;
                case R.id.barcodeScan:
                    controller.navigate(R.id.action_mainMenuFragment_to_addProductFragment);
                    break;
                case R.id.home:
                    bundle.putString("UID", UID);
                    if (controller.getCurrentDestination() != null && controller.getCurrentDestination().getId() == R.id.mainMenuFragment) {
                        controller.navigate(R.id.mainMenuFragment, bundle);
                    }
                    break;
            }
            return true;
        }
    };

onCreate in MainMenu.java:

bundle.putString("UID", UID);
        controller = Navigation.findNavController(this, R.id.fragment_container);
        controller.navigate(R.id.mainMenuFragment, bundle);

导航图xml

<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/navigation_mainmenu"
    app:startDestination="@id/mainMenuFragment">

    <fragment
        android:id="@+id/addCustomerFragment"
        android:name="com.google.android.gms.samples.vision.barcodereader.fragments.customer.addCustomerFragment"
        android:label="addcustomerfragment"
        tools:layout="@layout/addcustomerfragment" />
    <fragment
        android:id="@+id/mainMenuFragment"
        android:name="com.google.android.gms.samples.vision.barcodereader.fragments.mainmenu.mainMenuFragment"
        android:label="mainmenufragment"
        tools:layout="@layout/mainmenufragment">
        <action
            android:id="@+id/action_mainMenuFragment_to_addProductFragment"
            app:destination="@id/addProductFragment"
            app:enterAnim="@anim/fui_slide_in_right"
            app:exitAnim="@anim/fui_slide_out_left"
            app:popExitAnim="@anim/fui_slide_out_left"
            app:popUpTo="@+id/mainMenuFragment" />
        <action
            android:id="@+id/action_mainMenuFragment_self"
            app:destination="@id/mainMenuFragment" />

        <action
            android:id="@+id/action_mainMenuFragment_to_addOrderFragment"
            app:destination="@id/addOrderFragment"
            app:enterAnim="@anim/fui_slide_in_right"
            app:exitAnim="@anim/fui_slide_out_left"
            app:popUpTo="@+id/mainMenuFragment" />
        <argument
            android:name="UID"
            app:argType="string"
            app:nullable="false" />
        <action
            android:id="@+id/action_mainMenuFragment_to_addCustomerFragment"
            app:destination="@id/addCustomerFragment"
            app:enterAnim="@anim/fui_slide_in_right"
            app:exitAnim="@anim/fui_slide_out_left"
            app:popUpTo="@+id/navigation_mainmenu" />
    </fragment>
    <fragment
        android:id="@+id/addProductFragment"
        android:name="com.google.android.gms.samples.vision.barcodereader.fragments.products.addProductFragment"
        android:label="addproductfragment"
        tools:layout="@layout/addproductfragment" />
    <fragment
        android:id="@+id/additionalInfoFragment"
        android:name="com.google.android.gms.samples.vision.barcodereader.fragments.orders.additionalInfoFragment"
        android:label="addinfofragment"
        tools:layout="@layout/addinfofragment">
        <argument
            android:name="UID"
            app:argType="string" />
    </fragment>
    <fragment
        android:id="@+id/addOrderFragment"
        android:name="com.google.android.gms.samples.vision.barcodereader.fragments.orders.addOrderFragment"
        android:label="choosecustomerfragment"
        tools:layout="@layout/choosecustomerfragment">
        <action
            android:id="@+id/action_addOrderFragment_to_additionalInfoFragment"
            app:destination="@id/additionalInfoFragment"
            app:enterAnim="@anim/fui_slide_in_right"
            app:exitAnim="@anim/fui_slide_out_left"
            app:popUpTo="@+id/mainMenuFragment" />
        <argument
            android:name="UID"
            app:argType="string" />
    </fragment>

使用 NavigationUI.setupWithNavigationController(控制器)将 BottomNavigationView 与 NavigationUI 结合使用应该可以解决问题。

来源链接:
https://medium.com/@vepetruskova/the-new-android-in-app-navigation-f7bfbe925b9 https://developer.android.com/guide/navigation/navigation-ui