Open1

6.TopBar

るるすたるるすた

依存関係

material3のアイコンを使うので、依存関係を追加。

libs.versions.toml

[libraries]
androidx-material-icons-core = { module = "androidx.compose.material:material-icons-core" }
androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }

→Sync Now!!!

build.gradle.kts

dependencies {
    implementation(libs.androidx.material.icons.core) // アイコンコア(Material 2/3共通)
    implementation(libs.androidx.material.icons.extended) // 拡張アイコンセット(Filled, Outlinedなど)

→Sync Now!!!

TopBar

  • TopBarはCenterAlignedTopAppBarを使用。
  • 最初に表示されるHomeだけ、TopBarが表示されないよう制御。
  • 直前の画面、現在のルート、現在の画面を変数に格納。
  • 表示の設定はnavigationIcon、title、colorの3つ。
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopBar(
    navController: NavController
) {
    val navBackStackEntry = navController.currentBackStackEntryAsState().value  //直前の画面
    val currentRoute = navBackStackEntry?.destination?.route    //今のルート
    val currentScreen = when (currentRoute) {                   //今の画面
        Screen.Home.route -> Screen.Home
        Screen.Profile.route -> Screen.Profile
        Screen.Drill.route -> Screen.Drill
        Screen.Drawing.route -> Screen.Drawing
        else -> Screen.Home
    }

    if (currentRoute != Screen.Home.route) {    //HomeにいるときだけTopBarを表示しない
        CenterAlignedTopAppBar(
            navigationIcon = {
                if (navController.previousBackStackEntry != null) {
                    IconButton(onClick = { navController.popBackStack() }) {
                        Icon(imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = stringResource(R.string.icon_back))
                    }
                }
            },
            title = {
                Row(verticalAlignment = Alignment.CenterVertically) {
                    Text(text = currentScreen.emoji(), fontSize=36.sp)
                    Spacer(modifier = Modifier.width(dimensionResource(R.dimen.p_medium)))
                    Text(text = currentScreen.displayName(),
                        style = MaterialTheme.typography.displaySmall)
                }
            },
            colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
                containerColor = MaterialTheme.colorScheme.surfaceDim,
            )
        )
    }
}

課題認識

TopBarの背景色を画面ごとに動的に変えたい。
シールドクラスの中にfun bgColor関数を設定して、マテリアルカラーを指定したい。
が、うまくいかない。