package com.example.cv04ifelsenavi 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.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.example.cv04ifelsenavi.ui.theme.CV04IFELSENAVITheme /* Ukázka demonstruje přepínání dvou composable/stránek - Udržení stavu na nejvyšší úrovni, předávání událostí nahoru (state hoisting) - Nulová režie: Není potřeba přidávat žádnou externí knihovnu ani nastavovat navigační trasy (routes) - V tomto řešení si aplikace nepamatuje historii přechodů. - Pokud uživatel na telefonu použije systémové gesto nebo tlačítko Zpět, aplikace se nevrátí na první obrazovku, ale rovnou se minimalizuje či ukončí. - Pro dvě obrazovky stačí jedna podmínka. Jakmile má aplikace 4 a více obrazovek, řetězení podmínek nebo použtí when začne být nepřehledné - Navigation Compose: tyto problémy (historii obrazovek – back stack, přechodové animace i předávání parametrů mezi obrazovkami) řeší automaticky. */ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { CV04IFELSENAVITheme { // Stav určující zobrazenou obrazovku je uchováván na nejvyšší úrovni var isSecondScreen by remember { mutableStateOf(false) } Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> // Vykreslení je řízeno podmínkou na základě aktuálního stavu (podmíněné vykreslování) if (isSecondScreen) { Greeting2( name = "Android", modifier = Modifier.padding(innerPadding), // Událost návratu je zachycena a stav je změněn zpět onBack = { isSecondScreen = false } ) } else { Greeting( name = "Android", modifier = Modifier.padding(innerPadding), // Událost přechodu přepne stav na hodnotu true onNavigate = { isSecondScreen = true } ) } } } } } } @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") } } }