当前位置: 首页 > news >正文

安卓jetpack compose学习笔记-Navigation基础学习

目录

一、Navigation

二、BottomNavigation


        Compose是一个偏向静态刷新的UI组件,如果不想要自己管理页面切换的复杂状态,可以以使用Navigation组件。

        页面间的切换可以NavHost,使用底部页面切换栏,可以使用脚手架的bottomBar+NavHost。

一、Navigation页面跳转

        在Compose中使用navigation需要增加依赖:

implementation("androidx.navigation:navigation-compose:2.9.0")

        代码:

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import cn.yy.navhost.ui.theme.NavhostThemeclass MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContent {NavhostTheme {AppNavigation()}}}
}@Composable
fun AppNavigation() {val navController = rememberNavController()NavHost(navController = navController,startDestination = "home") {composable("welcome") {WelcomeScreen(navController = navController)}composable("login") {LoginScreen(navController = navController)}composable("home") {HomeScreen(navController = navController)}}
}@Composable
fun HomeScreen(navController: NavHostController) {Column(verticalArrangement = Arrangement.Center,modifier = Modifier.fillMaxSize()) {Text(text = "HomeScreen")Button(onClick = {navController.navigate("welcome")}) {Text(text = "welcome")}}
}@Composable
fun LoginScreen(navController: NavHostController) {Column(verticalArrangement = Arrangement.Center,modifier = Modifier.fillMaxSize()) {Text(text = "LoginScreen")Button(onClick = {navController.navigate("home")}) {Text(text = "home")}}
}@Composable
fun WelcomeScreen(navController: NavHostController) {Column(verticalArrangement = Arrangement.Center,modifier = Modifier.fillMaxSize()) {Text(text = "WelcomeScreen")Button(onClick = {navController.navigate("login")}) {Text(text = "login")}}
}@Preview(showBackground = true)
@Composable
fun GreetingPreview() {NavhostTheme {AppNavigation()}
}

        效果:

        

二、BottomNavigation页面跳转栏

        将Navigation集成脚手架(scaffold)中的bottomBar。

        先进行屏幕定义:

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.ShoppingCart
import androidx.compose.ui.graphics.vector.ImageVectorsealed class Screen(val route: String,val label: String,val icon: ImageVector
) {object Home : Screen("home", "home", Icons.Filled.Home)object Favorite : Screen("favorite", "favorite", Icons.Filled.Favorite)object Person : Screen("person", "person", Icons.Filled.Person)object ShoppingCart : Screen("shoppingCart", "shoppingCart", Icons.Filled.ShoppingCart)
}val items = listOf(Screen.Home,Screen.Favorite,Screen.Person,Screen.ShoppingCart,
)

        再使用脚手架:

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController@Composable
fun BottomNav() {var navController = rememberNavController()Scaffold(bottomBar = {NavigationBar {val navBackStackEntry = navController.currentBackStackEntryAsState()var currentDestination = navBackStackEntry.value?.destinationitems.forEachIndexed { index, screen ->NavigationBarItem(icon = { Icon(screen.icon, contentDescription = null) },label = { Text(screen.label) },selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true,onClick = {navController.navigate(screen.route) {popUpTo(navController.graph.findStartDestination().id) {saveState = true}launchSingleTop = truerestoreState = true}},)}}}) { innerPadding ->NavHost(navController,startDestination = Screen.Home.route,Modifier.padding(innerPadding)) {composable(Screen.Home.route) { DemoScreen("Home") }composable(Screen.Favorite.route) { DemoScreen("Favorite") }composable(Screen.Person.route) { DemoScreen("Person") }composable(Screen.ShoppingCart.route) { DemoScreen("ShoppingCart") }}}
}@Composable
fun DemoScreen(name: String) {Column(verticalArrangement = Arrangement.Center,modifier = Modifier.fillMaxSize()) {Text("This is $name")}
}@Preview
@Composable
fun PreBottomNav() {BottomNav()
}

        效果:

http://www.lqws.cn/news/483715.html

相关文章:

  • 使用css做出折叠导航栏的功能
  • 【appium】5. Appium WebDriver 支持的常用方法汇总
  • Flink源码阅读环境准备全攻略:搭建高效探索的基石
  • 基于Docker本地化搭建部署Dify
  • CSS Background 相关属性详解 文字镂空效果
  • springboot企业级项目开发之项目测试——集成测试!
  • Idea/Pycharm用法总结
  • 安卓官方版fat-aar:使用Fused Library将多个Android库发布为一个库
  • 机器学习:特征向量与数据维数概念
  • 从代码学习深度强化学习 - Actor-Critic 算法 PyTorch版
  • Ubuntu22.04.4 开启root帐号SSH登陆
  • [Linux] Vim编辑器 Linux输入输出重定向
  • 风险矩阵与灰色综合评价
  • 【Pytest 使用教程】
  • 15.3 LLaMA 3+LangChain实战:智能点餐Agent多轮对话设计落地,订单准确率提升90%!
  • 心法学习 - 苏格拉底式提问法
  • aws(学习笔记第四十六课) codepipeline-build-deploy
  • P99延迟:系统性能优化的关键指标
  • Python嵌套循环
  • Selenium等待机制详解:从原理到实战应用
  • 阿里云CentOS系统搭建全攻略:开启云端技术之旅
  • 群晖 NAS Docker 镜像加速配置详细教程
  • 【数据结构】七种常见排序算法
  • 多项目质量标准如何统一制定与执行
  • Python函数实战:从基础到高级应用
  • esp-idf的freertos的俩个配置项
  • RA4M2开发IOT(7)----RA4M2驱动涂鸦CBU模组
  • 通俗理解物联网中的APN
  • mp.set_start_method(“spawn“)
  • 【Android】am命令