我的应用程序中有一个屏幕,允许用户编辑数据库中的项目,在用户完成编辑项目后,他们单击“完成”按钮,将他们带到上一个屏幕。但是当用户单击后退按钮时,他们将再次进入编辑屏幕。
我想要的是当用户单击后退按钮时转到另一个屏幕,就像他们从未去过编辑屏幕一样。
这是我的导航图:
@Composable
fun AppNavigator(
textFieldsViewModel: TextFieldsViewModel,
shoppingListsViewModel: ShoppingListsViewModel,
addNewShoppingListViewModel: AddNewShoppingListViewModel
) {
val navController = rememberNavController()
NavHost(navController, startDestination = "SplashScreen") {
composable("SplashScreen") {
SplashScreen(navController = navController)
}
composable("shoppingLists") {
ShoppingListsScreen(
navController = navController,
shoppingListsViewModel = shoppingListsViewModel,
textFieldsViewModel = textFieldsViewModel
)
}
composable(
"ItemsList/{listID}",
arguments = listOf(navArgument("listID") { type = NavType.IntType })
) {
ShoppingListItemsScreen(
it.arguments?.getInt("listID")!!,
shoppingListsViewModel = shoppingListsViewModel,
textFieldsViewModel = textFieldsViewModel,
navController = navController
)
}
composable(
"EditItem/{itemId},{itemName},{itemQuantity},{itemParentListId}",
arguments = listOf(
navArgument("itemId") { type = NavType.IntType },
navArgument("itemName") …Run Code Online (Sandbox Code Playgroud) kotlin android-jetpack android-architecture-navigation android-jetpack-compose jetpack-compose-navigation
我正在尝试从第一个屏幕导航到第二个屏幕,并且我需要提供一个整数标识符来从第二个屏幕上的 API 加载内容。
我在尝试传递 Int Nav 参数时遇到此错误。
java.lang.ClassCastException:java.lang.String无法转换为java.lang.Integer
这是我的 NavHost,我将/{recipeId}其用作第二个屏幕路线上的占位符。
NavHost(
navController = navController,
startDestination = Screens.RecipesOverviewScreen.route
) {
//1st Screen
composable(route = Screens.RecipesOverviewScreen.route) {
RecipesOverviewScreen(
navController = navController,
onToggleTheme = { app.toggleLightTheme() })
}
//2nd Screen
composable(route = "${Screens.RecipeDetailScreen.route}/{recipeId}")
{
RecipeDetailScreen()
}
Run Code Online (Sandbox Code Playgroud)
然后,我调用navController.navigate()第一个屏幕,将idInt 类型传递到导航路线中。
RecipeList(recipes = listState.recipes,
onClickRecipeCard = { id ->
//insert corresponding Int id into the Nav route
navController.navigate(
route = "${Screens.RecipeDetailScreen.route}/${id}"
)
}
Run Code Online (Sandbox Code Playgroud)
在第二个屏幕的 ViewModel 中,我使用 SavedHandleInstance 检索 nav 参数。 …
我想使用基于导航栏中所选状态的轮廓和填充图标,就像谷歌地图应用程序一样,使用jetpack compose。如果是 xml,我们使用选择器,那么我们使用什么来进行 compose 呢?
这是我的代码->
MainActivity.kt
@ExperimentalMaterial3Api
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Handle the splash screen transition.
installSplashScreen()
setContent {
MyApp()
}
}
}
@ExperimentalMaterial3Api
@Composable
fun MyApp() {
MyTheme {
val items = listOf(
Screen.HomeScreen,
Screen.MusicScreen,
Screen.ProfileScreen
)
val navController = rememberNavController()
Scaffold(
bottomBar = {
NavigationBar {
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
items.forEach { screen ->
NavigationBarItem(
icon = {
Icon(
screen.icon_outlined,
contentDescription = screen.label.toString()
)
}, …Run Code Online (Sandbox Code Playgroud) android material-components-android android-jetpack-compose android-jetpack-compose-scaffold jetpack-compose-navigation
是否可以从可组合的屏幕(也在 aFloatingActionButton内部)设置 aonClick内部的值?在我的示例中,我希望能够更改 FAB 的 onClick 以根据屏幕可组合项内的值 ( ) 进行一些计算,而不将该值提升到该值所在的可组合项( )。ScaffoldNavHostScaffoldnameScaffoldMyActivity()
@Composable
fun MyActivity() {
val navController = rememberNavController()
Scaffold(
floatingActionButton = {
FloatingActionButton(onClick = { /* set this lambda from Screen1 */ }) { ... }
}
) { paddingValues ->
NavHost(
navController = navController,
startDestination = Screen.Screen1.route,
modifier = Modifier.padding(paddingValues)
) {
composable(route = Screen.Screen1.route) {
Screen1()
}
...
}
}
}
@Composable
fun Screen1() {
var name …Run Code Online (Sandbox Code Playgroud) android-navigation android-jetpack-compose jetpack-compose-navigation
我正在使用 Jetpack Compose 和 Android 导航组件。当我在带有 的屏幕上时AlertDialog,我无法返回。我猜这是由于AlertDialog捕获了后退按钮事件。但是我不知道如何连接AlertDialog到导航组件?有没有官方的方法或最佳实践来做到这一点?这是我的代码:
// sample with a screen and a "navigate to dialog" button.
// once the button is pressed, an AlertDialog is shown.
// Using the back button while the AlertDialog is open has no effect ):
@Composable
fun MyNavHost(navController: NavHostController, modifier: Modifier = Modifier) {
NavHost(
navController = navController,
startDestination = "start_route",
modifier = modifier
) {
composable("start_route") {
Text("start screen")
}
// this is my screen with …Run Code Online (Sandbox Code Playgroud) android android-architecture-navigation android-jetpack-compose jetpack-compose-navigation navigation-compose
我正在尝试Navigation使用单个活动和多个Composable屏幕来实现。
这是我的NavHost:
@Composable
@ExperimentalFoundationApi
fun MyNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
startDestination: String = HOME.route,
viewModelProvider: ViewModelProvider,
speech: SpeechHelper
) = NavHost(
modifier = modifier,
navController = navController,
startDestination = startDestination
) {
composable(route = HOME.route) {
with(viewModelProvider[HomeViewModel::class.java]) {
HomeScreen(
speech = speech,
viewModel = this,
modifier = Modifier.onKeyEvent { handleKeyEvent(it, this) }
) {
navController.navigateTo(it)
}
}
}
composable(route = Destination.VOLUME_SETTINGS.route) {
VolumeSettingsScreen(
viewModelProvider[VolumeSettingsViewModel::class.java]
) { navController.navigateUp() }
}
} …Run Code Online (Sandbox Code Playgroud) android infinite-loop android-jetpack-compose jetpack-compose-navigation compose-recomposition
我试图实现 jetpack compose 底部导航栏。但我遇到了这个问题。每当标签没有足够的空间时,它就会与图标重叠。我错过了什么吗?有没有自动截断或缩小文本之类的解决方案?
compose_version = '1.0.0-beta09'
我的代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
val items = listOf(
Screen.Profile,
Screen.FriendsList,
Screen.Notification,
Screen.Setting
)
Scaffold(
bottomBar = {
BottomNavigation(
backgroundColor = MaterialTheme.colors.surface,
elevation = 8.dp
) {
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
items.forEachIndexed { index, screen ->
BottomNavigationItem(
icon = {
when (index) {
0 -> Icon(Icons.Filled.Person, "Profile")
1 -> Icon(
painterResource(id = R.drawable.ic_friends),
"Friends"
)
2 -> Icon(Icons.Filled.Notifications, "Notification")
else -> …Run Code Online (Sandbox Code Playgroud) android android-bottomnav android-jetpack-compose jetpack-compose-navigation
我正在尝试在此SO 线程之后设置导航后退按钮,但无法使其工作。
@ExperimentalFoundationApi
@Composable
fun LazyVerticalGridActivityScreen() {
val navController = rememberNavController()
val navigationIcon: (@Composable () -> Unit)? =
if (navController.previousBackStackEntry != null) {
{
IconButton(onClick = { navController.popBackStack() }) {
Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = null)
}
}
} else {
null
}
Scaffold(
topBar = {
TopAppBar(title = { Text("Lazy Vertical Grid") }, navigationIcon = navigationIcon)
},
content = {
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen(navController) }
composable("details/{listId}") { backStackEntry ->
backStackEntry.arguments?.getString("listId")
?.let { …Run Code Online (Sandbox Code Playgroud) 我正在探索文档中指定的撰写导航。
添加文档中指定的版本的依赖项2.4.0-alpha07会出现以下错误,
错误1
检查 AAR 元数据值时发现的一个或多个问题:
依赖项的 AAR 元数据 (META-INF/com/android/build/gradle/aar-metadata.properties) 中指定的 minCompileSdk (31) 大于此模块的compileSdkVersion (android-30)。依赖项:androidx.navigation:navigation-compose:2.4.0-alpha07。AAR 元数据文件:/Users/abhimanyu/.gradle/caches/transforms-3/0575ff5712e0a9c15b8d7424501c07b8/transformed/jetified-navigation-compose-2.4.0-alpha07/META-INF/com/android/build/gradle/aar-metadata。特性。
这个错误迫使我将我的应用程序从 30 升级到 31 compileSdkVersion。targetSdkVersion
升级版本出现这个错误,
错误2
清单合并失败:针对 Android 12 及更高版本的应用需要
android: exported在相应组件定义了意图过滤器时指定显式值。有关详细信息,请参阅https://developer.android.com/guide/topics/manifest/activity-element#exported 。
为了解决这个问题,检查了这篇文章。
即使添加后android:exported,我也收到相同的错误(错误2)。
compileSdkVersion升级到31是强制的吗?
如果是,如何解决错误2。如果否,如何解决错误1?
如果可能的话,我个人更喜欢坚持使用 SDK 30。
我正在使用 Accompanist 动画库:
implementation "com.google.accompanist:accompanist-navigation-animation:0.24.0-alpha"
Run Code Online (Sandbox Code Playgroud)
我有以下 AnimatedNavHost:
val navController = rememberAnimatedNavController()
AnimatedNavHost(
navController = navController,
startDestination = "auth",
enterTransition = { EnterTransition.None },
exitTransition = { ExitTransition.None }
) {
composable(
route = "auth"
) {
AuthScreen(
navController = navController
)
}
composable(
route = "profile"
) {
ProfileScreen(
navController = navController
)
}
}
Run Code Online (Sandbox Code Playgroud)
我的 AuthScreen 很简单:
Box(
modifier = Modifier.fillMaxSize().padding(bottom = 48.dp),
contentAlignment = Alignment.BottomCenter
) {
Button(
onClick = {
signIn()
}
) {
Text(
text = …Run Code Online (Sandbox Code Playgroud) android kotlin android-jetpack-compose jetpack-compose-navigation