package com.example.cv04navigation import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button 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.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.example.cv04navigation.ui.theme.CV04NAVIGATIONTheme /* Ukázka demonstruje přepínání dvou obrazovek pomocí knihovny Navigation Compose: - Vyžadována je závislost: androidx.navigation:navigation-compose (build.gradle module). implementation("androidx.navigation:navigation-compose:2.10.2") - Místo stavové proměnné (Boolean) je využit NavController a NavHost. - Jednotlivé obrazovky jsou registrovány pomocí textových tras (routes). - Historie přechodů (back stack) je spravována automaticky: při použití systémového gesta nebo hardwarového tlačítka Zpět je proveden návrat na předchozí obrazovku. - Samotné komponenty Greeting a Greeting2 zůstávají nezměněny – řízení navigace je jim předáváno z vyšší úrovně pomocí callbacků (state hoisting). */ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { CV04NAVIGATIONTheme { // Je vytvořen a zapamatován kontrolér navigace uchovávající historii obrazovek val navController = rememberNavController() Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> // NavHost definuje mapování tras na konkrétní obrazovky // Vnitřní odsazení ze Scaffold je aplikováno přímo na kontejner NavHost NavHost( navController = navController, startDestination = "greeting", modifier = Modifier.padding(innerPadding) ) { // Registrace výchozí obrazovky composable("greeting") { Greeting( name = "Android", // Přechod na další obrazovku je proveden zavoláním metody navigate() onNavigate = { navController.navigate("greeting2") } ) } // Registrace druhé obrazovky composable("greeting2") { Greeting2( name = "Android", // Návrat je vyvolán odebráním obrazovky ze zásobníku (popBackStack) onBack = { navController.popBackStack() } ) } } } } } } } @Composable fun Greeting(name: String, modifier: Modifier = Modifier, onNavigate: () -> Unit) { Column(modifier = modifier) { Text(text = "Hello $name!") // Kliknutím na tlačítko je vyvolán callback do nadřazené komponenty Button(onClick = onNavigate) { Text("Přejít na druhou obrazovku") } } } @Composable fun Greeting2(name: String, modifier: Modifier = Modifier, onBack: () -> Unit) { Column(modifier = modifier) { Text(text = "Druhá obrazovka") // Kliknutím na tlačítko je vyvolán návrat zpět Button(onClick = onBack) { Text("Zpět") } } }