【问题标题】:Android Jet Pack Navigation, setupWithNavController() recreating fragmentAndroid Jetpack Navigation,setupWithNavController() 重新创建片段
【发布时间】:2018-12-18 14:53:10
【问题描述】:

我在使用 jetpack 的 BottomNavBar 时的导航视图有问题

这就是我的流程的运作方式。

我有 4 个视图,每个视图都有重定向,例如当我在导航栏的最后选择时我有一个 fragment A -> fragment B 当我回到导航栏的第一个选择时我再次回到第四个fragment A。我相信这是因为碎片正在使用setupWithNavController() 重新创建,如果喷气背包有解决方法吗?

这是我的代码供参考。

<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。非常感谢。

编辑

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))
    }

}

【问题讨论】:

  • 我相信你应该包含一些 Kotlin 来帮助我们理解上下文和正在完成的代码。例如,我想看看bottomNav.setupWithNavController 在哪里调用。
  • @shkschneider - 我更新了代码,它就在那里。非常感谢。

标签: android android-fragments kotlin navigation fragment


【解决方案1】:

这与您的 BottomNav 的设置无关。它是为 Android 制作的实现中的显式行为。我将引用并解释:

行为 在 Android 上:应用导航到目的地的顶级屏幕。任何先前的用户交互和临时屏幕状态都会被重置,例如滚动位置、选项卡选择和内联搜索。

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

这意味着当您单击底部导航上的项目时,它应该始终返回到此流堆栈上的第一个片段。


如果我不清楚,这里是一个伪表示:

BottomNavItem#1 > Fragment1A > Fragment1B

BottomNavItem#2 > Fragment2A > Fragment2B

如果您点击BottomNavItem#1,它会加载Fragment1A。然后想象使用一个显示Fragment1B 的按钮。如果您现在单击BottomNavItem#2,您将看到Fragment2A。现在,如果您返回BottomNavItem#1,它将显示Fragment1A不是您上次看到的Fragment1B),因为它是该堆栈/流的根。

【讨论】:

  • 您有什么可以建议我做的解决方法或我会改变的事情吗?
  • 当然非常不鼓励使用标准小部件,而且我从未实现过这样的事情(对“后退”行为保持谨慎)所以可悲的是no,我不知道如何定制这个.我只是解释了为什么会这样。祝你好运。
  • 非常感谢您给我带来这些信息,先生!
  • 不客气。如果您发现有用的东西,请回答您自己的问题,这可能对其他人有所帮助;)
猜你喜欢
  • 2021-07-13
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多