Как я могу запустить новый график навигации, по нажатию FAB? - PullRequest
4 голосов
/ 24 февраля 2020

Проблема:

Я новичок в Android, и я думаю, что концептуально я просто что-то неправильно понимаю. Я не могу иметь два navHostFragments в одной и той же деятельности. Я получаю эту ошибку.

Ошибка надувания фрагмента класса

График bottomNavigationView сам по себе работает очень хорошо, и я могу без проблем переключать вкладки, проблема возникает при попытке добавить новую навигацию по клику FAB. Я не хочу заменять контейнер фрагментов новым, я хочу запустить новый фрагмент, который будет полноэкранным

Контекст:

  • В основном задании у меня есть складная панель инструментов, bottomNavigationView и кнопка FAB . Я также хочу иметь два NavHostFragment, по одному для каждого графика навигации.
  • Первый график навигации обрабатывает переключение между вкладками bottomNavigationView (содержимое фрагментов отображается под сворачиваемой панелью инструментов и сверху ofNavigationView)
  • Второй график навигации появится при нажатии FAB и будет полноэкранным

Что у меня есть:

Это Вот как Activity_main. xml выглядит как

        <com.google.android.material.appbar.AppBarLayout
            .....
        />
        <fragment
            android:id="@+id/waiterNavigationHostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="false"
            app:navGraph="@navigation/waiter_navigation" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/appBarLayout"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">  

            <fragment
                android:id="@+id/bottomNavigationHostFragment"
                android:name="androidx.navigation.fragment.NavHostFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:defaultNavHost="true"
                app:navGraph="@navigation/bottom_navigation" />

        </FrameLayout>
        <FrameLayout>
            <com.google.android.material.floatingactionbutton.FloatingActionButton
                .........
            />
            <com.google.android.material.bottomnavigation.BottomNavigationView
                ........
            />
        </FrameLayout>

Это waiter_navigation. xml, который должен отображаться в полноэкранном режиме при нажатии FAB:

<?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/waiter_screen">
    <fragment
        android:id="@+id/waiter_screen"
        android:name=".app.ui.waiter.WaiterScreenFragment"
        android:label="fragment_waiter"
        tools:layout="@layout/fragment_waiter" >
        <action
            android:id="@+id/navigate_to_menu_screen"
            app:destination="@id/menuScreenFragment" />
    </fragment>
    <fragment
        android:id="@+id/menu_screen"
        android:name=".app.ui.menu.MenuScreenFragment"
        android:label="MenuScreenFragment"
        tools:layout="@layout/fragment_menu" />
</navigation>

Это bottom_navigation. xml это происходит между свернутой панелью приложения и bottomNavigationView:

<?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/bottom_navigation"
    app:startDestination="@id/home_screen">
    <fragment
        android:id="@+id/home_screen"
        android:name=".app.ui.home.HomeScreenFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/navigate_to_receipt_screen"
            app:destination="@id/receipt_screen"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"/>
    </fragment>
    <fragment
        android:id="@+id/receipt_screen"
        android:name=".app.ui.receipt.ReceiptScreenFragment"
        android:label="fragment_explore"
        tools:layout="@layout/fragment_receipt" >
        <action
            android:id="@+id/navigate_to_profile_screen"
            app:destination="@id/profile_screen"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"/>
    </fragment>
    <fragment
        android:id="@+id/profile_screen"
        android:name=".app.ui.profile.ProfileScreenFragment"
        android:label="fragment_more"
        tools:layout="@layout/fragment_profile" />

</navigation>

Полная информация об ошибке

2020-02-24 11: 54: 30.401 16857-16857 / com.restaurant. app E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.restaurant.app, PID: 16857 java .lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.restaurant.app/com.restaurant.app.ui.ma in.MainScreenActivity}: android .view.InflateException: двоичная XML строка файла # 45: двоичная XML строка файла # 45: ошибка надувания фрагмента класса в android .app.ActivityThread.performLaunchActivity (ActivityThread. java: 2946) в android .app.ActivityThread.handleLaunchActivity (ActivityThread. java: 3081) в android .app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem. java: 78) в android .app .servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor. java: 108) в android .app.servertransaction.TransactionExecutor.execute (TransactionExecutor. java: 68) в android .app.ActivityThread $ H.handleMessage (ActivityThread . java: 1831) в android .os.Handler.dispatchMessage (Обработчик. java: 106) в android .os.Looper.l oop (Looper. java: 201) в android .app.ActivityThread.main (ActivityThread. java: 6806) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run ( RuntimeInit. java: 547) в com. android .internal.os.ZygoteInit.main ( ZygoteInit. java: 873) Вызывается: android .view.InflateException: двоичный файл XML строка файла # 45: двоичный файл XML строка файла № 45: ошибка раздувания фрагмента класса. Вызывается: android .view. InflateException: двоичная XML строка файла # 45: ошибка надувания фрагмента класса, вызванная: java .lang.IllegalStateException: не определено начальное назначение с помощью приложения: startDestination для com.flypay.restaurant.app:id/waiter_screen at androidx.navigation .NavGraphNavigator.navigate (NavGraphNavigator. java: 61) в androidx.navigation.NavGraphNavigator.navigate (NavGraphNavigator. java: 28) в androidx.navigation.NavController.navigate (NavController 9). 10). navigation.NavController.onGraphCreated (NavController. java: 577) в androidx.navigation.NavController.setGraph (NavController. java: 534) в androidx.navigation.NavController.setGraph (NavController. java 499): 4 .navigation.NavController.setGraph (NavController. java: 481) на androidx.navigation.fragment.NavHostFragment.onCreate (NavHostFragment. * 1 090 *: 237) на андроиде. фрагмент.app.Fragment.performCreate (Fragment. java: 2684) в androidx.fragment.app.FragmentStateManager.create (FragmentStateManager. java: 280) в androidx.fragment.app.FragmentManager.moveToState (FragmentManager. java: 1175) в androidx.fragment.app.FragmentManager.moveToState (FragmentManager. java: 1356) в androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView (FragmentLayoutInflaterFactory. java: 109) в androidlerFragment. .onCreateView (FragmentController. java: 135) в androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView (FragmentActivity. java: 356) в androidx.fragment.app.FragmentActivity.onCreateView (FragmentActivity. java): 335 android .view.LayoutInflater.createViewFromTag (LayoutInflater. java: 784) в android .view.LayoutInflater.createViewFromTag (LayoutInflater. java: 734) в android .view.LayoutInflater.rInfter. java: 867) в android .view.LayoutInflater.rInflateChildren (LayoutInflater. java: 828) в android .view.Layo utInflater.inflate (LayoutInflater. java: 519) в android .view.LayoutInflater.inflate (LayoutInflater. java: 427) в android .view.LayoutInflater.inflate (LayoutInflater. java: 374) в androidx.appcompat.app.AppCompatDelegateImpl.setContentView (AppCompatDelegateImpl. java: 469) в androidx.appcompat.app.AppCompatActivity.setContentView (AppCompatActivity. java: 140) в com.flypay.res.ta. .MainScreenActivity.onCreate (MainScreenActivity.kt: 17) в android .app.Activity.performCreate (Activity. java: 7224) в android .app.Activity.performCreate (Activity. java: 7213) в android .app.Instrumentation.callActivityOnCreate (Instrumentation. java: 1272) в android .app.ActivityThread.performLaunchActivity (ActivityThread. java: 2926) в android .app.ActivityThread.handleLaunchActivity (ActivityThread. java: 3081) 2020-02-24 11: 54: 30.402 16857-16857 / com.restaurant.app E / AndroidRuntime: at android .app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem. java: 78) в android .app.servertransactio n.TransactionExecutor.executeCallbacks (TransactionExecutor. java: 108) в android .app.servertransaction.TransactionExecutor.execute (TransactionExecutor. java: 68) в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1831) в android .os.Handler.dispatchMessage (Обработчик. java: 106) в android .os.Looper.l oop (Looper. java: 201) в android .app.ActivityThread.main (ActivityThread. java: 6806) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit . java: 547) по тел. android .internal.os.ZygoteInit.main (ZygoteInit. java: 873)

1 Ответ

0 голосов
/ 25 февраля 2020
<?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"
    app:startDestination="@id/ADD_SCREEN_NAME"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/waiter_screen">
    <fragment
        android:id="@+id/waiter_screen"
        android:name=".app.ui.waiter.WaiterScreenFragment"
        android:label="fragment_waiter"
        tools:layout="@layout/fragment_waiter" >
        <action
            android:id="@+id/navigate_to_menu_screen"
            app:destination="@id/menuScreenFragment" />
    </fragment>
    <fragment
        android:id="@+id/menu_screen"
        android:name=".app.ui.menu.MenuScreenFragment"
        android:label="MenuScreenFragment"
        tools:layout="@layout/fragment_menu" />
</navigation>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...