标签: android-navigation

如何清除导航组件中的碎片堆栈?

我像这样尝试使用 FragmentManager:

Navigation.findNavController(mView).popBackStack()
Run Code Online (Sandbox Code Playgroud)

并尝试使用FragmentManager.

val fm = activity!!.supportFragmentManager
Run Code Online (Sandbox Code Playgroud)

1.

fm.popBackStack()
Run Code Online (Sandbox Code Playgroud)

2.

fm.popBackStackImmediate()
Run Code Online (Sandbox Code Playgroud)

但他们没有工作。我的意思是,它们似乎弹出所有的片段。

我还尝试将这些属性应用于graph_nav.xml

app:launchSingleTop="true"
app:popUpToInclusive="true"
Run Code Online (Sandbox Code Playgroud)

我将它们应用于 A 片段和 B 片段。

我想从A片段转到B片段。我想清除 B 片段之前的所有片段堆栈,只留下 B 片段。

android android-fragments android-navigation

6
推荐指数
1
解决办法
1万
查看次数

无法找到 DialogFragment 中的 NavController

我有一个包含 NavHostFragment 的 BottomSheetDialogFragment,如下所示:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <fragment
                android:id="@+id/add_feeling_nav_host_fragment"
                android:name="androidx.navigation.fragment.NavHostFragment"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                app:defaultNavHost="true"
                app:navGraph="@navigation/add_feeling_graph" />

    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下任一方法在其类中获取 NavController 时:

activity?.findNavController(R.id.add_feeling_nav_host_fragment)
view.findNavController()
Run Code Online (Sandbox Code Playgroud)

第一个选项崩溃,因为它找不到 ID,而第二个选项确实找到了父导航控制器并使用它。

我为另一个 Fragment 设置了相同的设置,但它不是一个对话框,而且运行良好。有什么想法可能是什么问题?谢谢

android android-dialogfragment android-navigation android-architecture-navigation

6
推荐指数
1
解决办法
1452
查看次数

安卓导航。从嵌套图片段弹出到外部片段

我有一个带有主导航图的应用程序模块和带有它自己的导航图的功能模块。功能导航包含在主导航图中。因此功能片段和导航图对应用程序模块导航图一无所知。我需要将堆栈从主图中的特征片段 A 弹出到片段 B。实现这一目标的最佳方法是什么?

android android-fragments android-navigation android-module

6
推荐指数
1
解决办法
2906
查看次数

Android 导航弹出动画不起作用

我目前正在尝试使用 Android 导航组件从一个片段 (A) 导航到另一个 (B),方法是从屏幕底部(在片段 A 上)向上动画片段 B,然后在按下后退按钮时将片段 B 向下动画被按下。我目前为此定义了一个操作:

<action
        android:id="@+id/action_landingFragment_to_bookingFragment"
        app:destination="@id/bookingFragment"
        app:enterAnim="@anim/booking_screen_in"
        app:exitAnim="@anim/nothing"
        app:popEnterAnim="@anim/nothing"
        app:popExitAnim="@anim/booking_screen_out"
        app:popUpTo="@id/landingFragment" />
Run Code Online (Sandbox Code Playgroud)

然而,当我当前从片段 A 导航到片段 B 时,我从屏幕底部平滑地向上滑动,点击后退按钮并看到片段 B 立即消失以再次显示片段 A,没有动画。我目前没有为片段 B 上的后退按钮使用自定义代码(尽管我尝试navigateUp()popBackStack()在 anOnBackPressedCallback中查看我是否遗漏了有关这些的内容。我还想知道片段的 Z 轴是否存在问题(类似于此线程) ) 但我的正常进入/退出动画工作正常,我尝试了一组更传统的动画(向左/向右滑动),其中进入和退出动画播放,但弹出动画再次不播放。

任何人都可以提出正确的返回导航方法,以便这些流行动画应该可见吗?

android android-fragments android-navigation android-architecture-navigation

6
推荐指数
0
解决办法
388
查看次数

Android Jetpack 导航 - 如何从抽屉菜单项导航到嵌套导航图

我很好奇如何使用 Android Jetpack 中的导航图从抽屉布局中的菜单项导航到嵌套导航图。我知道幕后有一些魔法可以将菜单项与基于 Id 的片段链接起来,但我不知道如何将菜单项链接到嵌套导航图。

例如,我使用 Android Studio 附带的默认导航抽屉活动项目。我已将 mobile_navigation.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/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.example.testdrawer.ui.home.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" />

    <include app:graph="@navigation/nested_navigation" />

    <fragment
        android:id="@+id/nav_tools"
        android:name="com.example.testdrawer.ui.tools.ToolsFragment"
        android:label="@string/menu_tools"
        tools:layout="@layout/fragment_tools" />

    <fragment
        android:id="@+id/nav_share"
        android:name="com.example.testdrawer.ui.share.ShareFragment"
        android:label="@string/menu_share"
        tools:layout="@layout/fragment_share" />

    <fragment
        android:id="@+id/nav_send"
        android:name="com.example.testdrawer.ui.send.SendFragment"
        android:label="@string/menu_send"
        tools:layout="@layout/fragment_send" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

我还添加了一个名为nested_navigation.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/nested_navigation"
    app:startDestination="@+id/nav_gallery">

    <fragment
        android:id="@+id/nav_gallery"
        android:name="com.example.testdrawer.ui.gallery.GalleryFragment"
        android:label="@string/menu_gallery"
        tools:layout="@layout/fragment_gallery" />

    <fragment
        android:id="@+id/nav_slideshow"
        android:name="com.example.testdrawer.ui.slideshow.SlideshowFragment"
        android:label="@string/menu_slideshow"
        tools:layout="@layout/fragment_slideshow" />

</navigation>
Run Code Online (Sandbox Code Playgroud)

假设我的菜单如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_menu_camera"
            android:title="@string/menu_home" />
        <item …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-drawer android-jetpack android-jetpack-navigation

6
推荐指数
1
解决办法
714
查看次数

导航组件:从Viewpager中的Fragment导航到另一个Fragment

我有一个Fragment A导航到Fragment B

Fragment B主机 a ViewPager2.

ViewPager2里面有两个膨胀的碎片 -Fragment CFragment D

单击 中的项目后,Fragment C我想导航到Fragment D之上的新实例Fragment B

目前,我的代码是这样的 -

findNavController().navigate(
            R.id.action_FragmentC_to_FragmentD,
            bundleOf("id" to id, "type" to "list")
        )
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试导航时,出现以下异常 -

java.lang.IllegalArgumentException: Navigation action/destination com.test.at:id/action_FragmentC_to_FragmentD cannot be found from the current destination Destination(com.krtkush.audiotime:id/FragmentB) label=FragmentB
Run Code Online (Sandbox Code Playgroud)

据我所知,导航组件仍然处于打开状态Fragment B,但我正在尝试导航到Fragment Dfrom Fragment C,因此它引发了异常。

我(认为)可以通过添加一个侦听器来解决此问题,该侦听器会通知Fragment B何时点击该项目 Fragment C,然后导航到Fragment Dfrom Fragment B …

android android-fragments android-viewpager android-navigation android-architecture-navigation

6
推荐指数
1
解决办法
1461
查看次数

使用 Espresso 通过 NavGraphViewModel 测试 Viewpager

我目前有一个使用“一个活动-多个片段”方法的应用程序,并且在该应用程序中是一个与其子级共享重要数据的片段,因此我使用了 navGraphViewModels 范围为嵌套导航图,如下所示:

private val viewModel by navGraphViewModels<MySharedViewModel>(R.id.nested_nav_graph)
Run Code Online (Sandbox Code Playgroud)

父片段包含一个 viewPager,并且传递给该 viewPager 的片段都与父片段共享相同的 viewModel。我使用这种方法的问题是,当涉及使用 Espresso 进行涉及 navGraphViewModels 的 UI 测试时,我收到错误“View XXX 没有设置 NavController”。我设法通过以下内容修复了父片段的问题:

        val navController = TestNavHostController(ApplicationProvider.getApplicationContext())
        // This allows fragments to use by navGraphViewModels()
        navController.setViewModelStore(ViewModelStore())
        UiThreadStatement.runOnUiThread {
            navController.setGraph(R.navigation.nested_nav_graph)
        }
        val scenario =
            launchFragmentInContainer(themeResId = R.style.AppTheme) {
                MyFragment().also { fragment ->
                    fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
                        if (viewLifecycleOwner != null) {
                            Navigation.setViewNavController(fragment.requireView(), navController)
                        }
                    }
                }
            }
        return navController
    }
Run Code Online (Sandbox Code Playgroud)

但是,由于父片段随后将其子片段加载到 viewPager 中,并且这些子片段也需要 NavController,因此我的测试不会继续经过 @Before 块。任何有关如何将 navController 设置为子片段的帮助将不胜感激。

android android-fragments android-viewpager android-navigation android-espresso

6
推荐指数
0
解决办法
229
查看次数

找不到 android.arch.navigation:navigation-safe-args-gradle-plugin:2.3.5。?

我正在使用 android 导航组件,但出现错误配置根项目“AndroidCodingChallenge”时出现问题。

无法解析配置“:classpath”的所有工件。找不到 android.arch.navigation:navigation-safe-args-gradle-plugin:2.3.5。在以下位置进行了搜索:

在我的 app.gradle 下面

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}
apply plugin: 'androidx.navigation.safeargs.kotlin'
apply plugin: 'kotlin-kapt'
apply from: '../commons.gradle'

android {
    compileSdkVersion 30
    buildFeatures {

        dataBinding = true

        // for view binding:
        // viewBinding = true
    }

    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.example.androidcodingchallenge"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables{
            useSupportLibrary = true
        }

        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility …
Run Code Online (Sandbox Code Playgroud)

android gradle kotlin android-navigation android-safe-args

6
推荐指数
1
解决办法
6099
查看次数

Android 导航问题:多个返回堆栈

我的问题是,当我尝试使用底部导航更改片段时,它会起作用,但在一种情况下除外。我有 5 个片段,当我进入第 3 个片段并进入第 5 个片段后,第 5 个片段的图标 don\xc2\xb4t 改变了它的颜色。之后,当我进行另一次导航时,应用程序崩溃并给出下一个错误:

\n
java.lang.IndexOutOfBoundsException: fromIndex = -1\n    at java.util.ArrayList.subListRangeCheck(ArrayList.java:1014)\n    at java.util.ArrayList.subList(ArrayList.java:1008)\n    at androidx.navigation.fragment.FragmentNavigator.popBackStack(FragmentNavigator.kt:80)\n    at androidx.navigation.NavController.popBackStackInternal(NavController.kt:275)\n    at androidx.navigation.NavController.popBackStackInternal(NavController.kt:558)\n    at androidx.navigation.NavController.navigate(NavController.kt:1682)\n    at androidx.navigation.NavController.navigate(NavController.kt:1541)\n    at androidx.navigation.NavController.navigate(NavController.kt:1468)\n    at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.kt:92)\n    at androidx.navigation.ui.NavigationUI.setupWithNavController$lambda-6(NavigationUI.kt:602)\n    at androidx.navigation.ui.NavigationUI.$r8$lambda$6wzEv9QqEZKdQFS1sQQy-bdQvgE(Unknown Source:0)\n    at androidx.navigation.ui.NavigationUI$$ExternalSyntheticLambda2.onNavigationItemSelected(Unknown Source:2)\n    at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:295)\n    at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)\n    at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)\n    at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)\n    at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:133)\n    at android.view.View.performClick(View.java:7520)\n    at android.view.View.performClickInternal(View.java:7489)\n    at android.view.View.access$3600(View.java:826)\n    at android.view.View$PerformClick.run(View.java:28555)\n    at android.os.Handler.handleCallback(Handler.java:938)\n    at android.os.Handler.dispatchMessage(Handler.java:99)\n    at android.os.Looper.loop(Looper.java:233)\n    at android.app.ActivityThread.main(ActivityThread.java:8010)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果之前我单击了第 5 个片段并转到第 3 …

android android-navigation android-navigationview android-navigation-bar android-navigation-graph

6
推荐指数
1
解决办法
1270
查看次数

如何使用 jetpack 撰写导航注销后将用户重定向到登录页面

我在我的项目中使用 jetpack compose。我的应用程序包含多个屏幕和嵌套导航。所以我的 MainActivity 中有这个:

   val startDestination = if (setting.isUserLoggedIn)
            HomeNavGraph.HomeRoute.route
        else
            AuthenticationNavGraph.AuthenticationRoute.route

        setContent {
            val navController = rememberNavController()
            DoneTheme {
                NavHost(
                    navController = navController,
                    startDestination = startDestination
                ) {
                    authentication(navController = navController)
                    home()
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

此代码根据用户是否已登录来决定将用户导航到身份验证屏幕或主屏幕。首页导航是这样的:

fun NavGraphBuilder.home() {
    navigation(
        startDestination = HomeNavGraph.HomeScreen.route,
        route = HomeNavGraph.HomeRoute.route
    ) {
        composable(route = HomeNavGraph.HomeScreen.route)
        {
            HomeRouteScreen()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

HomeRouteScreen()本身具有底部导航及其 navHost。现在,我想将用户从个人资料屏幕导航到身份HomeRouteScreen()验证屏幕,其可组合项在 MainActivity 导航图中定义。

我的问题是:

如果我调用navcontroller.navigate(AuthenticationNavGraph.AuthenticationScreen.route),我会收到错误消息,表明目的地未明确显示在当前导航图中。另一方面,如果我使用navController主活动中存在的 ,HomeRouteScreen我会收到错误 ViewModelStore should be set before …

android android-navigation android-jetpack-compose

6
推荐指数
1
解决办法
3287
查看次数