标签: android-jetpack-navigation

如何在 jetpack compose 中导航到另一个屏幕而不出现此问题?

我在 Jetpack compose 中导航到另一个屏幕时遇到问题。我已经设置好所有内容,并仔细检查了所有内容,但是,当我按下按钮时,它应该会带到另一个屏幕。我在 logcat 中得到了一些调试信息,这表明导航确实出了问题,并且什么也不会发生。当我试图找出问题时,我发现应该代表第二个屏幕的函数被成功调用,并且当我使用函数 Log.d("Second screen") 时,它将成功地打印在日志猫中。尽管如此,任何内容都不会出现,之前的内容也不会消失。我试着用谷歌搜索它,还询问了聊天gpt,但我没有找到任何东西,聊天gpt只告诉我它应该工作正常,我应该再次检查所有内容。最后,我创建了一个新项目并将代码放入其中,认为可能是某些项目设置导致了问题,但没有任何改变。

这是我的 Main_activity。设置了导航的所有内容以及应该启动它的按钮:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ToDoApp2Theme {
                val navController = rememberNavController()
                NavHost(navController = navController, startDestination = Screens.HomeScreen.route) {
                    composable(route = Screens.HomeScreen.route){ Greeting(navController) }
                    composable(route = Screens.AddScreen.route){ Add_screen(navController) }
                }
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting(navController)
                }
            }
        }
    }
}

@Composable
fun Greeting(navController: NavController, modifier: Modifier = Modifier) {
    Box(modifier = Modifier
        .width(15.dp)
        .height(20.dp)
        .padding(vertical = 100.dp, …
Run Code Online (Sandbox Code Playgroud)

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

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

如何使用 Jetpack 的导航在片段中使用工具栏但不在活动中使用

我已经开始使用 Android Jetpack 的导航库。到目前为止,我觉得它很容易使用。我面临的问题是工具栏。

我想要实现的是:

  1. 用户打开应用程序并显示登录页面。这是导航的开始,不应显示工具栏。
  2. 如果用户第一次登录,将显示重置密码的片段(由管理员自动生成),以便用户更改密码。在这里,我想显示一个带有后退箭头的白色工具栏(没有文字)
  3. 如果用户之前登录过,我们会显示一个加载屏幕(也没有工具栏)

我尝试了很多事情,但没有成功。前两次尝试使用具有NoActionBar样式的活动。

重置密码片段中的工具栏

  • 带有工具栏的自定义 Appbar。它正在显示,但没有显示后退箭头。我尝试在我的工具栏中添加一个 Imageview,我也尝试从 java 设置图标,但这些都不起作用。
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".ResetPasswordFragment">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBar_resetPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:liftOnScroll="true"
        >

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar_resetPassword"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/white"
            />

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:id="@+id/scrollView_resetPassword"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <!-- Linear layout -->

    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

活动中的工具栏

这个尝试奏效了。它在我的活动中添加了一个工具栏,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout  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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:orientation="vertical"
    tools:context=".LoginActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:background="@color/white"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        />
    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp" …
Run Code Online (Sandbox Code Playgroud)

android toolbar android-fragments android-jetpack-navigation

2
推荐指数
1
解决办法
638
查看次数

Android 是否可以有多个 nav_graph 文件?

所以我一直在使用Jetpack navigation,碎片的数量一直在增长。

我们可以按照本文档中的描述将不同导航图中的片段分开

喷气背包导航图文档

然后我尝试将不同的导航图放在不同的文件中,因为这样感觉文件更有条理和可读性更强,但是当我尝试导航到不同的 nav_graph 文件时出现以下错误。

nav_graph_start.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/nav_graph_start"
    app:startDestination="@id/splashScreen"
    tools:ignore="UnusedNavigation">

    <fragment
        android:id="@+id/splashScreen"
        android:name="com.timetoface.android.splash.SplashFragment"
        android:label="Login Fragment"
        tools:layout="@layout/fragment_splash">

        <action
            android:id="@+id/action_splash_to_login"
            app:destination="@id/nav_graph_auth"
            />
        <action
            android:id="@+id/action_splash_to_home"
            app:destination="@id/nav_graph_home"
            />
    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

nav_graph_auth.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/nav_graph_auth"
    app:startDestination="@id/emailLoginScreen"
    tools:ignore="UnusedNavigation">
................................
</navigation>
Run Code Online (Sandbox Code Playgroud)

nav_graph_home.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/nav_graph_home"
    app:startDestination="@id/emailLoginScreen"
    tools:ignore="UnusedNavigation">
................................
</navigation>
Run Code Online (Sandbox Code Playgroud)

从动作 com.app.android:id/action_splash_to_home 引用的导航目的地 com.app.android:id/nav_graph_home 对这个 NavController 来说是未知的

所以,

是否尚不支持多个导航图文件

我是否错过了一些我应该改变的东西?

android kotlin android-jetpack android-jetpack-navigation

2
推荐指数
1
解决办法
3515
查看次数

无法使用 NavigationUI 设置 optionMenu

我有片段,我想添加选项菜单。我已经尝试了很多但没有找到任何解决方案。

这是我的代码。

package com.code2hack.milkledger.fragment

import android.app.AlertDialog
import android.os.Bundle
import android.view.*
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.code2hack.milkledger.BaseActivity
import com.code2hack.milkledger.MainActivityViewModel
import com.code2hack.milkledger.R
import com.code2hack.milkledger.actionmode.ActionModeCallback
import com.code2hack.milkledger.adapter.CustomerAdapter
import com.code2hack.milkledger.dialog.AddUserDialog
import com.code2hack.milkledger.handler.ItemClickListener
import com.code2hack.milkledger.model.Customer
import com.code2hack.milkledger.util.Event
import com.google.android.material.card.MaterialCardView
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_customer_list.*

class CustomerListFragment : BaseFragment() {
    private val baseActivity: BaseActivity by lazy { activity as BaseActivity };
    private var selectMode = false
    val …
Run Code Online (Sandbox Code Playgroud)

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

2
推荐指数
1
解决办法
576
查看次数

Resources$NotFoundException 包含动态导航图

我有一个动态功能模块,它有自己的嵌套导航图。我还有一个动态功能模块,它只是一个片段。如果您有一个带有自己的导航图的动态功能模块,我知道您需要使用include-dynamic标签。当我构建应用程序并将应用程序部署到 Play 商店进行内部测试时,动态模块下载正确。但是,如果我在本地构建/运行 - 当我尝试导航到包含导航图的动态功能模块时,应用程序会崩溃。我以为在本地运行时一切都被捆绑了?有什么我想念的吗?

我得到的错误是 android.content.res.Resources$NotFoundException: com.xyz.app_name.two:navigation/two_navigation

main_navigation_graph

<!-- this works locally. module does not contain a nav graph -->
<fragment
    android:id="@+id/OneFragment"
    android:name="com.xyz.app_name.one.OneFragment"
    android:label="{nickname}"
    app:moduleName="one"
    tools:layout="@layout/one_fragment">
    <argument
        android:name="nickname"
        app:argType="string" />
</fragment>

<!-- this doesn't work locally -->
<include-dynamic
    android:id="@+id/two_graph"
    app:graphPackage="com.xyz.app_name.two"
    app:graphResName="two_navigation"
    app:moduleName="two" />
Run Code Online (Sandbox Code Playgroud)

feature_two_graph

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/two_graph"
    app:moduleName="two"
    app:startDestination="@id/twoFragment">

    <fragment
        android:id="@+id/twoFragment"
        android:name="com.xyz.app_name.two.TwoFragment"
        android:label="{nickname}"
        tools:layout="@layout/two_fragment">
        <argument
            android:name="nickname"
            app:argType="string" />
        <action
            android:id="@+id/action_twoFragment_to_dialogFragment"
            app:destination="@id/dialogFragment" />
    </fragment>

    <dialog
        android:id="@+id/dialogFragment"
        android:name="com.xyz.app_name.two.ui.DialogFragment"
        android:label="bottom_sheet"
        tools:layout="@layout/bottom_sheet" />

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

android android-jetpack android-architecture-navigation android-jetpack-navigation dynamic-feature-module

2
推荐指数
1
解决办法
336
查看次数

在 Jetpack Compose 中导航时记住列表项状态

如果我们为像 valstate = remember(it) { mutableStateOf(ItemState()) }这样的列表项创建状态,那么我们在滚动时会失去扩展状态。

如果我们在 LazyColumn 之前提升生成更高的状态,那么扩展状态将正确保存

 val states = items.map { remember(it) { mutableStateOf(ItemState()) } }
 LazyColumn(modifier = Modifier.fillMaxSize()) {....
Run Code Online (Sandbox Code Playgroud)

但是当我们展开一个项目时,点击按钮,转到详细信息屏幕,然后回到我们松开展开状态的项目。保存项目状态的最佳方法是什么?

 val states = items.map { remember(it) { mutableStateOf(ItemState()) } }
 LazyColumn(modifier = Modifier.fillMaxSize()) {....
Run Code Online (Sandbox Code Playgroud)

android-jetpack-navigation android-jetpack-compose

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

Jetpack Compose BackPressHandler 无法拦截 onResume 后的后按操作

在我的 Jetpack Compose 项目中,我使用Android 示例中的BackPressHandler 。一切都按预期工作,直到我暂停并恢复应用程序。此时BackPressHandler不再拦截后退按钮,导航只是默认为常规后按行为。

能够在演示项目中重现该问题,请参阅代码示例:

https://gist.github.com/vitalnik/2a444c20cb9f370c405ee1ddb86d3e66

谢谢!

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

2
推荐指数
1
解决办法
4869
查看次数

如何在 Activity 中获取 navController?

我使用 Jetpack Navigation 在片段和活动之间导航。所以,我在布局中有一个MainActivity带有 a 的。FragmentContainerView我可以轻松地从片段导航到片段/活动。但是,我找不到一种方法如何使用navController.

例如,我从片段 FA 调用navController.navigate()活动 A。现在,我想从活动 A 导航到活动 B 或片段 FB。

我已经尝试过这个:

val host = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = host.navController
Run Code Online (Sandbox Code Playgroud)

但总是出现这个错误

null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment
Run Code Online (Sandbox Code Playgroud)

谢谢!

android android-jetpack android-jetpack-navigation

2
推荐指数
1
解决办法
6245
查看次数

无法使用导航和喷气背包组合弹出起始目的地

我在 Android 上使用最新版本的导航和撰写,但遇到一个错误,无法弹出导航的起始目的地。问题是,如果我有 3 个目的地(A、B、C)并从 A-> B -> C,我无法从后退堆栈中弹出 A,但当我调用时会弹出 B,导致后退popUpTo(B) inclusive = true按钮回到A。

我的代码:

导航主机

setContent {

        val navController = rememberNavController()

        NavHost(
            navController = navController,
            startDestination = "route_to_a"
        ) {

            composable("route_to_a") {
                LoginScreen(navController)
            }

            composable("route_to_b") {
                RegisterScreen(navController)
            }

            composable("route_to_c") {
                HomeScreen(navController = navController)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

导航

- A 到 B

Button(onClick = { navController.navigate("route_to_b")}) {}
Run Code Online (Sandbox Code Playgroud)

- B 到 C

Button(onClick = {
    navController.navigate("route_to_c") {
        popUpTo("route_to_b") {
            inclusive = true
        }
    }
}) {}
Run Code Online (Sandbox Code Playgroud)

我想创建一个流程,其中 A 和 …

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

2
推荐指数
1
解决办法
2781
查看次数

向前导航时如何将底部工作表保留在后退堆栈中?

我在我的项目中使用伴奏底部表目的地。设置与文档中显示的完全相同。

@Composable
fun MyApp() {
    val bottomSheetNavigator = rememberBottomSheetNavigator()
    val navController = rememberNavController(bottomSheetNavigator)
    ModalBottomSheetLayout(bottomSheetNavigator) {
        NavHost(navController, Destinations.Home) {
           composable(route = "home") {
               HomeScreen(
                   openBottomSheet = { navController.navigate("sheet")  }
               )
           }
           bottomSheet(route = "sheet") {
               MyBottonSheet(
                   navigateToSomeRoute = { navController.navigate("some_route") }
               )
           }
           composable(route = "some_route") {
               SomeComposable(
                   onBackPress = { navController.navigateUp() }
               )
           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyBottomSheet这里我有一个打开屏幕的按钮SomeComposable。但是当我从那里向上导航时,我到达了HomeScreen即当我导航离开底部工作表时,底部工作表从后堆栈中弹出。如何将底部工作表保留在后堆栈中,以便当我按“后退”键时SomeComposable返回到打开状态MyBottonSheet(位于 顶部HomeScreen)的上一个状态?

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

2
推荐指数
1
解决办法
1360
查看次数