我在 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
我已经开始使用 Android Jetpack 的导航库。到目前为止,我觉得它很容易使用。我面临的问题是工具栏。
我想要实现的是:
我尝试了很多事情,但没有成功。前两次尝试使用具有NoActionBar样式的活动。
<?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
所以我一直在使用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 来说是未知的
所以,
是否尚不支持多个导航图文件?
我是否错过了一些我应该改变的东西?
我有片段,我想添加选项菜单。我已经尝试了很多但没有找到任何解决方案。
这是我的代码。
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
我有一个动态功能模块,它有自己的嵌套导航图。我还有一个动态功能模块,它只是一个片段。如果您有一个带有自己的导航图的动态功能模块,我知道您需要使用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
如果我们为像 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) 在我的 Jetpack Compose 项目中,我使用Android 示例中的BackPressHandler 。一切都按预期工作,直到我暂停并恢复应用程序。此时BackPressHandler不再拦截后退按钮,导航只是默认为常规后按行为。
能够在演示项目中重现该问题,请参阅代码示例:
https://gist.github.com/vitalnik/2a444c20cb9f370c405ee1ddb86d3e66
谢谢!
android onbackpressed android-jetpack-navigation android-jetpack-compose
我使用 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 上使用最新版本的导航和撰写,但遇到一个错误,无法弹出导航的起始目的地。问题是,如果我有 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
我在我的项目中使用伴奏底部表目的地。设置与文档中显示的完全相同。
@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
android-jetpack-navigation ×10
android ×9
kotlin ×3
android-architecture-navigation ×2
fragment ×1
jetpack-compose-accompanist ×1
toolbar ×1