Навигация по Android Jet Pack, setupWithNavController () воссоздание фрагмента - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблема с моим видом навигации, использующим BottomNavBar Jetpack

, вот как работает мой поток.

У меня есть 4 вида, и у каждого из них есть перенаправления, как когда я впоследний выбор панели навигации у меня есть fragment A -> fragment B, а когда я возвращаюсь к первому выбору панели навигации, а когда я возвращаюсь к четвертому, снова появляется fragment A.Я полагаю, что это потому, что фрагменты воссоздаются с использованием setupWithNavController(), если это так, у Jetpack есть обходной путь для этого?

Вот мой код для справки.

<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/nav_graph"
    app:startDestination="@+id/splashFragment">
    <fragment
        android:id="@+id/selectionFragment"
        android:name="whitecloak.com.allibuy.app.selection.SelectionFragment"
        android:label="fragment_selection"
        tools:layout="@layout/fragment_selection" >
        <action
            android:id="@+id/toLogin"
            app:destination="@id/loginFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/nav_graph" 
            app:popUpToInclusive="true/>
    </fragment>

    <fragment
       android:id="@+id/splashFragment"
       android:name="whitecloak.com.allibuy.app.splash.SplashFragment"
        android:label="fragment_splash"
        tools:layout="@layout/splash_fragment"
        >
        <action
            android:id="@+id/toMain"
            app:destination="@id/mainFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/nav_graph"
            app:popUpToInclusive="true"/>
    </fragment>

<menu xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/splashFragment"
    android:icon="@drawable/home"
    android:title="@string/home"
    app:popUpTo="@id/nav_graph" />

<item
    android:id="@+id/tabCart"
    android:icon="@drawable/cart"
    android:title="@string/cart"
    app:popUpTo="@id/nav_graph" />

<item
    android:id="@+id/tabNotif"
    android:icon="@drawable/notification"
    android:title="@string/notification"
    app:popUpTo="@id/nav_graph"/>

<item
    android:id="@+id/selectionFragment"
    android:icon="@drawable/user"
    android:title="@string/account"
    app:popUpTo="@id/nav_graph" />

bottomNav.setupWithNavController(findNavController(R.id.nav_main))

Я только что включил XML для 1-й и последней вкладки.Большое вам спасибо.

РЕДАКТИРОВАТЬ

class MainNavigation : DaggerAppCompatActivity() {
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory

    private lateinit var viewModel: MainNavigationViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProviders.of(this, viewModelFactory)[MainNavigationViewModel::class.java]

        bottomNav.setupWithNavController(findNavController(R.id.nav_main))
    }

}

1 Ответ

0 голосов
/ 19 декабря 2018

Это не связано с настройкой вашего BottomNav.Это скорее явное поведение в реализации, сделанной для Android.Я процитирую и объясню:

Поведение В Android: приложение перемещается на экран верхнего уровня пункта назначения .Все предыдущие взаимодействия с пользователем и временные состояния экрана сбрасываются, такие как положение прокрутки, выбор вкладки и поиск в строке.

С https://material.io/design/components/bottom-navigation.html#behavior

Это означает, что при нажатии кнопкиэлемент в BottomNav, он всегда должен возвращаться к первому фрагменту в стеке этого потока.


Если мне неясно, вот псевдопредставление:

BottomNavItem # 1> Fragment1A> Fragment1B

BottomNavItem # 2> Fragment2A> Fragment2B

Если вы нажмете BottomNavItem#1, загрузится Fragment1A.Затем представьте, что вы используете кнопку, которая показывает Fragment1B.Если вы сейчас нажмете BottomNavItem#2, вы увидите Fragment2A.Теперь, если вы снова нажмете BottomNavItem#1, он покажет Fragment1A ( не Fragment1B, который вы видели в последний раз), потому что это корень этого стека / потока.

...