标签: android-jetpack-navigation

使用 NavigationComponent 和 BottomNavigationView 隐藏工具栏后退箭头

我正在实现 NavigationComponent 和一个 BottomNavigationView,我注意到工具栏中显示了所有片段目的地的后退箭头,但startDestination在我的导航图中指定为 的除外。

我能够找到的此实现的所有示例都显示出类似的行为。在我看来,为 BottomNavigationView 的每个相关片段隐藏后退箭头似乎是一种更自然的设计,(点击工具栏中的后退箭头从选项卡 2 导航到选项卡 1 对我来说感觉很奇怪,我以前从未见过这种情况) .

有关示例以及我希望实现的目标,请参见下图。有什么办法可以做到这一点吗?在此处输入图片说明

android android-navigation android-toolbar android-jetpack android-jetpack-navigation

4
推荐指数
2
解决办法
3637
查看次数

“by navArgs<ScoreFragmentArgs>()”与“ScoreFragmentArgs.fromBundle(arguments!!)”有什么区别

val scoreFragmentArgs1 by navArgs<ScoreFragmentArgs>() 

val scoreFragmentArgs2 = ScoreFragmentArgs.fromBundle(arguments!!)
Run Code Online (Sandbox Code Playgroud)

我可以使用上述任何语句访问从前一个片段传递的参数。有人可以解释它们的区别以及何时使用它们。提前致谢

android kotlin android-jetpack android-jetpack-navigation

4
推荐指数
1
解决办法
1456
查看次数

我可以同时使用 setupWithNavController 和 setOnNavigationItemSelectedListener

我有一个带有 5 个项目和片段的 BottomNavigationView 活动来显示页面,我将 NavController 设置如下:NavigationUI.setupWithNavController(mBottomNavigationView, navController);

但在某些场景中底部导航中有一个项目会打开另一个活动。

我尝试添加 setOnNavigationItemSelectedListener 并处理它,但是其他项目的导航不起作用。

谁能帮我 ?

android uinavigationcontroller android-jetpack android-jetpack-navigation

4
推荐指数
1
解决办法
1535
查看次数

如何在 Java 项目中使用 NavigationExtensions.kt?

我正在尝试在一个新项目中使用底部导航实现 NavController。这是我的第一次尝试,到处都有很多关于此的模棱两可的信息。

所以我的问题涉及每个底部选项卡都有自己的返回堆栈并在底部导航点击之间保留片段。是的,我已经查看了https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample,但我无法理解如何将其与我现有的 Java 代码集成,因为示例在 Kotlin 中。

谁能帮我这个?

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

4
推荐指数
1
解决办法
937
查看次数

Android 导航 - 弹出后退堆栈时删除操作栏后退按钮

我正在尝试做什么

我正在使用 Android 导航组件来处理我的应用程序中的导航。在此示例中,我有两个屏幕,屏幕 A 和屏幕 B。我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后无法返回到上一屏幕(屏幕 A)。

问题

当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回上一屏幕,但是当单击底部栏中的后退按钮时,它会退出应用程序,因此这部分工作正常。

我需要做什么才能删除操作栏中的后退按钮?

在此输入图像描述

到目前为止我读过的内容

我已遵循这三篇文章中的指导,但我认为他们可能忽略了ActionBar后退按钮:

我的代码

导航图 - nav_graph.xml

<?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"
    android:id="@+id/nav_graph"
    app:startDestination="@id/screen_a">
    <fragment
        android:id="@+id/screen_a"
        android:name="com.example.conditionalnavigation.AFragment"
        android:label="screen A">
        <action
            android:id="@+id/action_AFragment_to_BFragment"
            app:destination="@id/screen_b"
            app:launchSingleTop="true"
            app:popUpTo="@id/screen_a"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen_b"
        android:name="com.example.conditionalnavigation.BFragment"
        android:label="screen B" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

MainActivity - 这充当我的单一活动导航主机。

class MainActivity : AppCompatActivity() {

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

android kotlin back-stack android-navigation android-jetpack-navigation

4
推荐指数
1
解决办法
4139
查看次数

OkHttpInterceptor 从 kotlin 拦截器导航到登录片段

我在这里有点挣扎。

我想要实现的是,如果发生 401,则从 Httpinterceptor 导航回登录片段。

我使用 Jwt 进行授权,如果令牌不再有效,后端将返回 401 未经授权。

我尝试用谷歌搜索这个问题,但最终没有真正解决我的问题。

到目前为止,我尝试做的是通过 NavHostFragment.findNavController 和 findNavController(MainActivity.activity, 1) 获取导航控制器。

这两件事都不起作用,因为第一个要求您提供拦截器中没有的片段,而第二个则失败,因为我无法找到从拦截器访问 MainActivity 的方法。

没有太多代码,但这就是拦截器现在的样子(由于明显的原因而不起作用)

package de.wabi.vistascraper.library.http.interceptors

import androidx.navigation.Navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import de.wabi.vistascraper.MainActivity
import de.wabi.vistascraper.ui.main.MainFragment
import okhttp3.Interceptor
import okhttp3.Response

class ErrorInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        var builder = chain.request().newBuilder()

        var response = chain.proceed(builder.build())

        var test = NavHostFragment.findNavController(this.);

        if(response.code == 401){
           // var test = findNavController(MainActivity.activity, 1)

        }
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

也许互联网上的你们有一个想法。

提前致谢

大卫

android interceptor kotlin okhttp android-jetpack-navigation

4
推荐指数
1
解决办法
1918
查看次数

ContentScale.FillWidth 不起作用 Jetpack Compose

我正在尝试制作一个可组合项,我可以通过使用传递任意大小的图像来填充其宽度来使用它

compose_version = 1.0.0-beta07
Run Code Online (Sandbox Code Playgroud)
@Composable 
fun image(image:Int){
          Image(painter = painterResource(image), 
          contentDescriptionn = null, contentScale = ContentScale.FillWidth)
}
Run Code Online (Sandbox Code Playgroud)

当我传递其他图像时,它可以工作,但是当我传递宽度和高度相同的图像时,它不起作用

如何解决这个问题?

android android-jetpack-navigation android-jetpack-compose

4
推荐指数
1
解决办法
2570
查看次数

由于 jetpack compose android 中的检查失败而导致崩溃

我在活动之间(例如活动 A 到活动 B)传递一个可序列化的数据类。活动 B 有 Jetpack Composable 视图。当我通过单击按钮从活动 A 导航到活动 B 时,出现以下崩溃

Process: uk.gov.tfl.gotfl, PID: 10022
    java.lang.IllegalStateException: Check failed.
        at androidx.compose.runtime.saveable.SaveableStateRegistryImpl.performSave(SaveableStateRegistry.kt:150)
        at androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt.DisposableSaveableStateRegistry$lambda-0(DisposableSaveableStateRegistry.android.kt:83)
        at androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt.$r8$lambda$sa5VqeXN41zeUSACzKO7aWvSsug(Unknown Source:0)
        at androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt$$ExternalSyntheticLambda0.saveState(Unknown Source:2)
        at androidx.savedstate.SavedStateRegistry.performSave(SavedStateRegistry.java:240)
        at androidx.savedstate.SavedStateRegistryController.performSave(SavedStateRegistryController.java:99)
        at androidx.activity.ComponentActivity.onSaveInstanceState(ComponentActivity.java:358)
        at android.app.Activity.performSaveInstanceState(Activity.java:2169)
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1625)
        at android.app.ActivityThread.callActivityOnSaveInstanceState(ActivityThread.java:5680)
        at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5051)
        at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5016)
        at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5090)
        at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2246)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:233)
        at android.app.ActivityThread.main(ActivityThread.java:8010)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
Run Code Online (Sandbox Code Playgroud)

有谁知道我为什么会崩溃?我没有做任何不同的事情。它简单明了。

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

4
推荐指数
1
解决办法
3381
查看次数

如果提供的参数包含特殊字符,则无法在 Jetpack Compose 中导航

Navigation destination that matches request NavDeepLinkRequest{ uri=android-app://androidx.navigation/testScreen/Can I change this (Pin / Password)?/100/300 } cannot be found in the navigation graph
Run Code Online (Sandbox Code Playgroud)

在哪里

我可以更改此设置(PIN 码/密码)吗?

是我的屏幕的标题。我在尝试导航时遇到异常。我怎样才能避免这个问题,因为我的标题包含“/”,它被视为深层链接本身的一部分。

android android-jetpack-navigation android-jetpack-compose

4
推荐指数
1
解决办法
996
查看次数

浏览 Jetpack Compose 时如何清除后台堆栈?

我正在应用程序中实现注销操作。我希望当用户单击“注销”时,转到“登录”。当用户采取以下路径:登录 -> 主页 -> 设置(单击注销) -> 登录时,当我按回键时,应用程序将转到后台并关闭,这是我想要的行为。

但是,当用户采用以下路线时:登录 -> 主页 -> ScreenOne -> ScreenTwo -> 主页 -> ScreenOne -> 设置(单击“注销”)-> 登录,当您按返回时,它会返回到“设置”并如果您再次按下它,它将转到 ScreenOne 等。

这就是当我单击“注销”时导航到“登录”的方式:

navController.navigate(NavigationItem.Login.route) {
            popUpTo(NavigationItem.Login.route) {
                inclusive = true
            }
        }
Run Code Online (Sandbox Code Playgroud)

注意:已经尝试将 Navigation.Home.route 作为 popUpTo 的参数。

我不知道是否相关,但这就是我在 Home -> ScreenOne -> ScreenTwo -> Home -> ScreenOne 之间进行导航的方式:

navController.navigate(item.route) {
                    navController.graph.startDestinationRoute?.let { route ->
                        popUpTo(route = route) {
                            saveState = true
                        }
                    }

                    launchSingleTop = true
                    restoreState = true
                }
Run Code Online (Sandbox Code Playgroud)

有谁知道我如何清除后堆栈或保证在第二种行为中,当我在注销后进入登录屏幕并按“返回”时,应用程序将进入第二个计划?

编辑:添加了 NavHost 结构。

@Composable
@ExperimentalFoundationApi
@ExperimentalComposeUiApi …
Run Code Online (Sandbox Code Playgroud)

android-jetpack-navigation android-jetpack-compose

4
推荐指数
1
解决办法
3571
查看次数