标签: android-jetpack-navigation

Android 导航组件中的清除返回堆栈

当显示主片段时,我试图清除返回堆栈中的所有片段。在导航图中我添加了这个操作

<fragment
       android:id="@+id/loginFragment"
       android:name="com.test.navTest.ui.fragment.LoginFragment"
       android:label="fragment_login"
       tools:layout="@layout/login_fragment"
       >
       <action
           android:id="@+id/action_loginFragment_to_homeFragment"
           app:destination="@id/homeFragment"
           app:popUpTo="@+id/homeFragment"

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

并在登录片段中。我试过 findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToHomeFragment())

findNavController().navigate(R.id.action_loginFragment_to_homeFragment)

据我从此处的文档了解,https://developer.android.com/guide/navigation/navigation-navigatepopUpTo清除所有堆栈,直至到达目的地。但当我按回时,什么也没有清除。

更新:我将此操作更改为 popUpTo=Login。它仅删除了登录片段,而不删除了之前的 2 个片段。我应该在登录之前向片段的操作添加任何参数吗

<action
            android:id="@+id/action_loginFragment_to_homeFragment"
            app:destination="@id/homeFragment"
            app:popUpTo="@+id/loginFragment"
            app:popUpToInclusive="true" />```
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-navigation

3
推荐指数
1
解决办法
4449
查看次数

工具栏后退按钮因起始目的地而隐藏

背景

我试图为每个模块使用一个活动,其中每个活动都有自己的导航图。因此,导航从一个动态功能模块中的活动转到另一个动态功能模块中的另一活动。

功能 1/活动 A -> 功能 2/活动 B

ActivityA 只是调用基本startActivity方法来启动 ActivityB。

问题

因为从ActivityB技术上讲,它的片段位于起始目的地。即使我的后退堆栈中有后退按钮,它也不会显示后退按钮ActivityA。有什么办法可以解决这个问题吗?

PS:由于ActivityA&ActivityB位于两个独立的模块中,我避免将它们放在一张图表下。对于活动转换,我只是startActivity通过intent使用创建来调用className

更新- 即使我使用导航控制器从 ActivityA 的片段导航到 ActivityB,问题仍然存在。

ActivityB.xml

</layout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/main_toolbar"
            app:navigationIcon="@drawable/ic_back"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="@string/title" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/host_container"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:defaultNavHost="true"
            app:navGraph="@navigation/landing_graph" />
    </LinearLayout>

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

活动B.kt

internal class ActivityB : AppCompatActivity() {

    private var navController : NavController? = null

    override fun onCreate(savedInstanceState: Bundle?) …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-jetpack-navigation

3
推荐指数
1
解决办法
1039
查看次数

@anim/fragment_fade_enter 包含在哪里?

@anim/fragment_fade_enter包含在其中androidx.fragment:fragment-ktx:1.2.4,但在我将其更新到版本后1.3.3,我似乎无法再解决它,我在网上只能找到它应该包含在 Androidx Core 中https://android.googlesource.com/platform/frameworks /base/+/master/core/res/res/animator/fragment_fade_enter.xml 但使用androidx.core:core-ktx:1.3.2也没有帮助。

它是否被重构为另一个依赖项?

android android-jetpack android-architecture-navigation android-jetpack-navigation

3
推荐指数
1
解决办法
1485
查看次数

撰写导航到已在后台堆栈中的屏幕

我想要这样的导航:

-我有三个屏幕:“登录”、“注册”和“帐户恢复”;

-从每个屏幕,我可以导航到任何其他屏幕;

-当我从“登录”屏幕导航到“注册”,然后返回“登录”(单击“转到登录”按钮)时,我希望拥有与开始时相同的屏幕,而不是新屏幕。

现在,每次当我返回“登录”时,我都会看到一个新屏幕:(

我的导航主机:

    val navController = rememberNavController()

    NavHost(navController = navController, startDestination = Screens.Login.route) {
        composable(route = Screens.Recovery.route) {
            RecoveryScreen(navController = navController)
        }
        composable(route = Screens.Login.route) {
            LoginScreen(navController = navController)
        }
        composable(route = Screens.Registration.route) {
            RegistrationScreen(navController = navController)
        }
    }
Run Code Online (Sandbox Code Playgroud)

指导我怎么挖?

android kotlin android-jetpack-navigation android-jetpack-compose

3
推荐指数
1
解决办法
2673
查看次数

禁用 BottomNavigationItem 的涟漪效果

我的应用程序需要一个底部导航栏。显示我使用的项目BottomNavigationItem

BottomNavigation(
    ...
) {
    ...
    BottomNavigationItem(
        ...
        onClick = {onItemSelect(item)},
        ...
    )
}
Run Code Online (Sandbox Code Playgroud)

然而,这些会带来连锁反应,我想禁用它,尽管我不知道如何禁用。需要BottomNavigationItem该属性,因此不能选择onClick使用修饰符。.clickable()

编辑:

Gabriele Mariotti 的这个回答MutableInteractionSource建议将 a 传递给.clickable函数,以及nullfor indication。虽然BottomNavigationItem接受 a MutableInteractionSource,但它似乎不接受 an indication

android-jetpack-navigation android-jetpack-compose

3
推荐指数
1
解决办法
2727
查看次数

按下返回键始终使用喷气背包导航返回起始目的地

所以,我BottomNavigationView与 Jetpack Navigation 联系在一起。假设我有 4 个底部导航菜单,片段 A、B、C 和 D,A 作为起始目的地。从片段 A 转到片段 B,然后转到片段 C。然后,我按下硬件后退按钮。我期望它返回到片段 B,相反,它返回到片段 A(这是起始目的地)。

这是代码:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment
navController = navHostFragment.navController

binding.navView.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这种行为?

谢谢~

编辑:我遵循 Zain 的答案,行为已经符合预期。但是,还有另一个问题。假设我有另一个片段 A1,它不是BottomNavView片段的一部分。我可以从片段 A 导航到片段 A1。下面是导航图:

<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/navigation_a">

    <fragment
        android:id="@+id/navigation_a"
        android:name="com.example.FragmentA"
        android:label=""
        tools:layout="@layout/fragment_a">
        <action
            android:id="@+id/action_navigation_a_to_navigation_a1"
            app:destination="@id/navigation_a1"
            app:launchSingleTop="true" />
    </fragment>
    <fragment
        android:id="@+id/navigation_a1"
        android:name="com.example.FragmentA1"
        android:label=""
        tools:layout="@layout/fragment_a1" />
    <fragment
        android:id="@+id/navigation_b"
        android:name="com.example.FragmentB"
        android:label=""
        tools:layout="@layout/fragment_b" />
    <fragment
        android:id="@+id/navigation_c"
        android:name="com.example.FragmentC"
        android:label=""
        tools:layout="@layout/fragment_c" />
    <fragment
        android:id="@+id/navigation_d"
        android:name="com.example.FragmentD"
        android:label=""
        tools:layout="@layout/fragment_d" …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-architecture-components android-jetpack-navigation

3
推荐指数
1
解决办法
1874
查看次数

Android 构建失败,并显示“parser.name 不能为 null”

在 Android 项目中,构建失败并出现以下错误:

> Task :app:generateSafeArgsDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:generateSafeArgsDebug'.
> parser.name must not be null
Run Code Online (Sandbox Code Playgroud)

android gradle android-jetpack-navigation

3
推荐指数
1
解决办法
1063
查看次数

Jetpack Compose 中没有焦点的 OnKeyEvent

我正在创建一个使用设备上的物理按钮的应用程序。

根据活动屏幕的不同,此按钮将具有不同的功能。

对于“活动”,我要做的就是为每个屏幕创建一个“活动”,并在每个屏幕中重写 onKeyDown 函数。如何通过在不同 Jetpack Compose 屏幕之间导航的单个 Activity 来实现此目的?根据Android文档,正确的方法是这样的......

Box(modifier = Modifier
    .onKeyEvent {
        Log.e("Pressed", it.nativeKeyEvent.keyCode.toString())
        true
    }
    .focusable()
    .fillMaxSize()
    .background(Color.Gray)
) {
    // All screen components
}
Run Code Online (Sandbox Code Playgroud)

但这仅在屏幕上的一个元素聚焦时才有效,而我要求的是它始终有效或无效,有没有办法实现这一点?

android kotlin android-jetpack-navigation android-jetpack-compose

3
推荐指数
1
解决办法
1924
查看次数

Android Jetpack 导航 - 如何在导航参数中传递空字符串?

AnimatedNavHost(navController, startDestination = BottomNavItem.Splash.screen_route){
composable(
            signup + "/{emailFromSignIn}" + "/{passwordFromSignIn}",
            arguments = listOf(
                navArgument("emailFromSignIn"){
                    type = NavType.StringType
            },navArgument("passwordFromSignIn"){
                    type = NavType.StringType
            }
}
Run Code Online (Sandbox Code Playgroud)
navController.navigate(signup + "/$textEmail" + "/$textPassword")

Run Code Online (Sandbox Code Playgroud)

我怎样才能传递一个空字符串?

错误:

在导航图中找不到与请求 NavDeepLinkRequest{ uri=android-app://androidx.navigation/signup// } 匹配的导航目的地 NavGraph(0x0) startDestination={Destination(0xb6b16c34) route=splash}

android kotlin android-jetpack android-jetpack-navigation android-jetpack-compose

3
推荐指数
1
解决办法
2217
查看次数

java.lang.IllegalStateException:指定的子级已经有父级。您必须首先在 jetpack compose 中对子级的父级调用 removeView()

我有一个带有一个 URL 的 Web 视图,每当它在 Web 视图中重定向时,我都会使用具有新标题的新 URL 再次加载相同的可组合项,因为重定向发生得如此之快,它发生在实际可组合项完全组成之前,因此它崩溃了java.lang.IllegalStateException:指定的子级已经有父级。您必须首先对子级的父级调用removeView()。我目前正在使用 ram Costa 的 compose 目标库

navigator.value?.navigate(direction = MenuViewDestination,onlyIfResumed = true)
Run Code Online (Sandbox Code Playgroud)

,我之前也使用过 compose 提供的导航,在这两种情况下我都面临着同样的问题,如果我仅使用恢复 true 进行导航,则页面由于某种原因不会自行导航,并且我无法按原样处理异常发生在内部。这里我附加了菜单可组合项中使用的可组合项来加载 URL,

/* Adding custom accompanist WebView*/
@SuppressLint("SetJavaScriptEnabled")
@Composable
fun LoadMenuWebView(mainViewModel: MainViewModel, webViewModel: MenuWebViewModel, url: String?) {
    Timber.i("LoadWebView from menu $url")
    val context = LocalContext.current
    var extraHeaders: Map<String, String?>?
    webViewModel.menuWebViewState.value = url?.let {
        rememberWebViewState(
            it
        )
    }
    mainViewModel.currentWebViewClient.value = remember {
        getWebViewClient(
            context,
            mainViewModel.backEnabled,
            mainViewModel.progressVisible,
            mainViewModel.cookieManager,
            mainViewModel
        )
    }
    val state by remember { webViewModel.menuWebViewState }
    val …
Run Code Online (Sandbox Code Playgroud)

android illegalstateexception android-jetpack-navigation android-jetpack-compose

3
推荐指数
1
解决办法
1557
查看次数