Создание базы данных помещений Jetpack Compose ⇐ Android
Создание базы данных помещений Jetpack Compose
Я пытаюсь реализовать базу данных комнат в своем проекте приложения-викторины для Android с помощью Jetpack Compose.
Уже больше недели пытаюсь понять, в чём проблема, но не могу разобраться. Я шаг за шагом следовал руководству по документации для Android, просмотрел много видеороликов по этой теме и даже попробовал использовать файл примера комнаты для документа Android .zip и напрямую изменить его.
Мне нужен пример реализации Room с тремя основными классами и, самое главное, как его использовать в пользовательском интерфейсе?
Случаи использования, которые я хочу решить:
[*]Кнопка для регистрации игроков [*]Кнопка для входа, если игрок уже есть в базе данных. Мой код player.kt пакет com.example.projetdevmob.playerDatabase импортировать androidx.room.Entity импортировать androidx.room.PrimaryKey @Entity(tableName = "Игрок") класс данных Player( @PrimaryKey(autoGenerate = true) идентификатор значения: Int = 0, вал псевдо: Строка, вал пароль: Строка, val limcoins: Длинные ) playerDao.kt пакет com.example.projetdevmob.playerDatabase импортировать androidx.lifecycle.LiveData импортировать androidx.room.* импортировать kotlinx.coroutines.flow.Flow @Дао интерфейс PlayerDao { @Insert(onConflict = OnConflictStrategy.IGNORE) приостановить веселье upsertPlayer(игрок: Игрок) @Удалить приостановить веселье deletePlayer(player: Player) @Query("SELECT * FROM Player ORDER BY псевдо-ASC") забавный заказPlayersByPseudo(): Flow @Query("ВЫБРАТЬ * ИЗ ПОРЯДКА Игрока ПО лимкоинам ASC") забавный заказPlayersByLimcoins(): Flow @Query("SELECT * FROM Player WHERE псевдо LIKE :псевдо И пароль LIKE :пароль") fun getPlayerByNameAndPassword(псевдо: String, пароль: String): LiveData } playerDatabase.kt пакет com.example.projetdevmob.playerDatabase импортировать androidx.lifecycle.LiveData импортировать androidx.room.* импортировать kotlinx.coroutines.flow.Flow @Дао интерфейс PlayerDao { @Insert(onConflict = OnConflictStrategy.IGNORE) приостановить веселье upsertPlayer(игрок: Игрок) @Удалить приостановить веселье deletePlayer(player: Player) @Query("SELECT * FROM Player ORDER BY псевдо-ASC") забавный заказPlayersByPseudo(): Flow @Query("ВЫБРАТЬ * ИЗ ПОРЯДКА Игрока ПО лимкоинам ASC") забавный заказPlayersByLimcoins(): Flow @Query("SELECT * FROM Player WHERE псевдо LIKE :псевдо И пароль LIKE :пароль") fun getPlayerByNameAndPassword(псевдо: String, пароль: String): LiveData } MainActivity.kt пакет com.example.projetdevmob.ProjetUI импортировать android.content.Intent // Весь остальной импорт .. класс MainActivity : ComponentActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ProjetDevMobTheme { AuthPage (модификатор = Модификатор) } } } } // страница авторизации @OptIn(ExperimentalMaterial3Api::class) @Композитный забавная AuthPage (модификатор: Модификатор) { контекст val = LocalContext.current val playerDatabase = Room.databaseBuilder( контекст, AppDatabase::class.java, "playersDatabase" ).строить() var pseudoInput by Remember {mutableStateOf("Entrez votre pseudo") } varpasswordInput by Remember {mutableStateOf("Entrez votre mot de passe") } val coroutineScope = RememberCoroutineScope() val backgroundColor = Цвет (0xFFE9FAE9) val fontColor = Цвет (0xFF7BEA7B) val superFunkyFamily = FontFamily( Шрифт(R.font.superfunkyfont, FontWeight.Light), ) Столбец( вертикальное расположение = расположение.SpaceEvenly, HorizontalAlignment = Alignment.CenterHorizontally, модификатор = модификатор .fillMaxSize() .background(цвет фона) ) { Столбец( // Название игры ) { Текст( text = "Что нужно сделать", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) Текст( text = "дез миллиардов?", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) } Столбец( ) { Ряд( ГоризонтальноеРасположение = Расположение.Центр, модификатор = модификатор .fillMaxWidth() ) { Текстовое поле( значение = псевдовход, onValueChange = {псевдоВход = это}, метка = { Текст («Псевдо») }, textStyle = androidx.compose.ui.text.TextStyle( FontFamily = superFunkyFamily, размер шрифта = 13.sp, textAlign = TextAlign.Центр, ) ) } Ряд( ГоризонтальноеРасположение = Расположение.Центр, модификатор = модификатор .fillMaxWidth() .padding(низ = 30.dp) ) { Текстовое поле( значение = ввод пароля, onValueChange = { парольВвод = это }, label = { Text("Слово") }, textStyle = androidx.compose.ui.text.TextStyle( FontFamily = superFunkyFamily, размер шрифта = 13.sp, textAlign = TextAlign.Центр, ) ) } Ряд( HorizontalArrangement = Arrangement.SpaceEvenly, модификатор = модификатор .fillMaxWidth() ) { Кнопка( onClick = { coroutineScope.launch { // Выполнение операций с базой данных Room в фоновом режиме // Замените следующую строку фактическими операциями с базой данных Room playerDatabase.playerDao().upsertPlayer(Player(0, pseudoInput,passwordInput,500)) } }, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Зарегистрироваться", FontFamily = superFunkyFamily, размер шрифта = 10.sp, ) } Кнопка( onClick = { coroutineScope.launch { // Выполнение операций с базой данных Room в фоновом режиме // Замените следующую строку фактическими операциями с базой данных Room val player = playerDatabase.getPlayerByNameAndPassword(псевдоВход, парольВвод) если (игрок != ноль) { context.startActivity(Intent(context, NormalMode::class.java)) } еще { Toast.makeText(context, «Неверное выражение», Toast.LENGTH_SHORT).show() } } }, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Войти", FontFamily = superFunkyFamily, размер шрифта = 10.sp, ) } } } Ряд( горизонтальное расположение = Расположение.Центр ) { Кнопка( onClick = { Toast.makeText(context, "Подключение к Google", Toast.LENGTH_SHORT).show() }, цвета = ButtonDefaults.buttonColors( контейнерЦвет = Цвет (0xFF4285F4), contentColor = Цвет.Белый ), ) { Текст( text = "Войти через Google", FontFamily = superFunkyFamily, размер шрифта = 10.sp, ) } } } } /* @Preview(showBackground = true) @Композитный весело AuthPagePreview() { ProjetDevMobTheme { AuthPage("Android", playerViewModel = playerViewModel) } } */ NormalMode.kt пакет com.example.projetdevmob.ProjetUI импортировать android.os.Bundle импортировать android.widget.Toast импортировать androidx.activity.ComponentActivity импортировать androidx.activity.compose.setContent импортировать androidx.compose.foundation.Image импортировать androidx.compose.foundation.background импортировать androidx.compose.foundation.layout.* импортировать androidx.compose.material3.* импортировать androidx.compose.runtime.* импортировать androidx.compose.ui.Alignment импортировать androidx.compose.ui.Modifier импортировать androidx.compose.ui.graphics.Color импортировать androidx.compose.ui.platform.LocalContext импортировать androidx.compose.ui.res.painterResource импортировать androidx.compose.ui.text.font.Font импортировать androidx.compose.ui.text.font.FontFamily импортировать androidx.compose.ui.text.font.FontWeight импортировать androidx.compose.ui.tooling.preview.Preview импортировать androidx.compose.ui.unit.dp импортировать androidx.compose.ui.unit.sp импортировать com.example.projetdevmob.R импортировать com.example.projetdevmob.ui.theme.ProjetDevMobTheme импортировать kotlinx.coroutines.delay класс NormalMode : ComponentActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ProjetDevMobTheme { // Поверхностный контейнер, использующий цвет фона из темы Поверхность (модификатор = Modifier.fillMaxSize (), цвет = MaterialTheme.colorScheme.background) { страница игры("Android") } } } } } // Страница игры @Композитный fun gamePage(имя: String, модификатор: Модификатор = Модификатор) { // Переменные и константы var limcoinsValue by Remember { mutableStateOf(500) } // VAR DE TEST, RECUPERER VALEUR DANS BASE DE DONNEES контекст val = LocalContext.current значение tempsMax = 60 var tempsRestant по памяти {mutableStateOf(tempsMax) } val backgroundColor = Цвет (0xFFE9FAE9) val fontColor = Цвет (0xFF7BEA7B) val superFunkyFamily = FontFamily( Шрифт(R.font.superfunkyfont, FontWeight.Light), ) // Индикаторы прогресса var currentProgress, запомнив {mutableStateOf(0f)} загрузка var по памяти {mutableStateOf(false)} область видимости = RememberCoroutineScope() // Элементы игры Столбец( HorizontalAlignment = Alignment.CenterHorizontally, вертикальное расположение = расположение.SpaceEvenly, модификатор = модификатор .fillMaxSize() .background(цвет фона) ) { Row( // Première ligne (compte à rebours et Limcoins) HorizontalArrangement = Arrangement.SpaceAround, модификатор = модификатор .fillMaxWidth() ) { Столбец( HorizontalAlignment = Alignment.CenterHorizontally, модификатор = модификатор .offset(y = (-10).dp) ) { LaunchedEffect(key1 = tempsRestant) { // Сопрограмма для восстановления данных в то время как (tempsRestant > 0){ задержка(1000л) tempsRestant-- } } Текст( text = "Оставшееся время: ", FontFamily = superFunkyFamily, размер шрифта = 13.sp, модификатор = модификатор ) Ряд( HorizontalArrangement = Arrangement.SpaceEvenly ) { Текст( текст = "$tempsRestant", FontFamily = superFunkyFamily, размер шрифта = 15.sp, ) ЦиркулярПрогрессИндикатор( прогресс = 1 - tempsRestant/tempsMax.toFloat(), цвет = цвет шрифта, модификатор = модификатор .size(25.dp) .padding(начало = 7.dp, верх = 4.dp) ) } } Столбец( модификатор = модификатор .offset(y = (-10).dp) ) { Текст( text = "Лимкоины: ", FontFamily = superFunkyFamily, размер шрифта = 13.sp, модификатор = модификатор ) Ряд() { Текст( текст = "$limcoinsValue", FontFamily = superFunkyFamily, размер шрифта = 15.sp, модификатор = модификатор ) Изображение( художник = PainterResource(R.drawable.limcoins), ContentDescription = ноль, модификатор = модификатор .size(25.dp) .padding(начало = 3.dp) ) } } } Столбец( // Название игры ) { Текст( text = "Что нужно сделать", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) Текст( text = "дез миллиардов?", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) } Столбец( // Вопрос + ответы HorizontalAlignment = Alignment.CenterHorizontally, модификатор = модификатор ) { Текст( // Вопрос текст = "Вопрос", FontFamily = superFunkyFamily, размер шрифта = 15.sp, модификатор = модификатор ) Row( // Ответы 1 и 2 HorizontalArrangement = Arrangement.SpaceAround, модификатор = модификатор .fillMaxWidth() .padding(верх = 30.dp) ) { Кнопка( onClick = { Toast.makeText(context,"Ответ 1", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Ответ 1", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } Кнопка( onClick = { Toast.makeText(context,"Ответ 2", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Ответ 2", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } } Row( // Ответы 3 и 4 HorizontalArrangement = Arrangement.SpaceAround, модификатор = модификатор .fillMaxWidth() .padding(верх = 30.dp) ) { Кнопка( onClick = { Toast.makeText(context,"Ответ 3", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Ответ 3", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } Кнопка( onClick = { Toast.makeText(context,"Ответ 4", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Цвет.Черный), ) { Текст( text = "Ответ 4", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } } } Ряд( модификатор = модификатор ) { ЛинейныйПрогрессИндикатор( прогресс = 1 - tempsRestant/tempsMax.toFloat(), цвет = цвет шрифта, ) } } } @Preview(showBackground = true) @Композитный забавная играPagePreview() { ProjetDevMobTheme { страница игры("Android") } } build.gradle buildscript { доб. { compose_ui_version = '1.2.0' } } плагины { id 'com.android.application' версии '7.4.1' применить false id 'com.android.library' версии '7.4.1' применить false идентификатор «org.jetbrains.kotlin.android» версии «1.7.0» применить ложь } приложение/build.gradle плагины { идентификатор 'com.android.application' идентификатор 'org.jetbrains.kotlin.android' идентификатор 'котлин-андроид' идентификатор 'котлин-капт' } андроид { пространство имен «com.example.projetdevmob» скомпилироватьSdk 34 defaultConfig { идентификатор приложения «com.example.projetdevmob» минСдк 24 цельSdk 34 Код версии 1 Имя версии "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" векторDrawables { использоватьSupportLibrary true } } типы сборки { выпускать { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } компиляцияварианты { исходная совместимость JavaVersion.VERSION_1_8 целевая совместимость JavaVersion.VERSION_1_8 } котлинОпции { jvmTarget = '1,8' } buildFeatures { сочинять правду } composeOptions { kotlinCompilerExtensionVersion '1.2.0' } Варианты упаковки { Ресурсы { исключает += '/META-INF/{AL2.0,LGPL2.1}' } } } зависимости { реализация «androidx.core:core-ktx:1.7.0» реализация 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' реализация «androidx.activity:activity-compose:1.3.1» реализация "androidx.compose.ui:ui:$compose_ui_version" реализация "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" реализация 'androidx.compose.material:material:1.2.0' реализация 'androidx.compose.material3:material3:1.0.0-alpha08' реализация 'androidx.room:room-ktx:2.6.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version" реализация "androidx.room:room-runtime:2.4.0" kapt "androidx.room:room-compiler:2.4.0" } AndroidManifest.xml
Я пытаюсь реализовать базу данных комнат в своем проекте приложения-викторины для Android с помощью Jetpack Compose.
Уже больше недели пытаюсь понять, в чём проблема, но не могу разобраться. Я шаг за шагом следовал руководству по документации для Android, просмотрел много видеороликов по этой теме и даже попробовал использовать файл примера комнаты для документа Android .zip и напрямую изменить его.
Мне нужен пример реализации Room с тремя основными классами и, самое главное, как его использовать в пользовательском интерфейсе?
Случаи использования, которые я хочу решить:
[*]Кнопка для регистрации игроков [*]Кнопка для входа, если игрок уже есть в базе данных. Мой код player.kt пакет com.example.projetdevmob.playerDatabase импортировать androidx.room.Entity импортировать androidx.room.PrimaryKey @Entity(tableName = "Игрок") класс данных Player( @PrimaryKey(autoGenerate = true) идентификатор значения: Int = 0, вал псевдо: Строка, вал пароль: Строка, val limcoins: Длинные ) playerDao.kt пакет com.example.projetdevmob.playerDatabase импортировать androidx.lifecycle.LiveData импортировать androidx.room.* импортировать kotlinx.coroutines.flow.Flow @Дао интерфейс PlayerDao { @Insert(onConflict = OnConflictStrategy.IGNORE) приостановить веселье upsertPlayer(игрок: Игрок) @Удалить приостановить веселье deletePlayer(player: Player) @Query("SELECT * FROM Player ORDER BY псевдо-ASC") забавный заказPlayersByPseudo(): Flow @Query("ВЫБРАТЬ * ИЗ ПОРЯДКА Игрока ПО лимкоинам ASC") забавный заказPlayersByLimcoins(): Flow @Query("SELECT * FROM Player WHERE псевдо LIKE :псевдо И пароль LIKE :пароль") fun getPlayerByNameAndPassword(псевдо: String, пароль: String): LiveData } playerDatabase.kt пакет com.example.projetdevmob.playerDatabase импортировать androidx.lifecycle.LiveData импортировать androidx.room.* импортировать kotlinx.coroutines.flow.Flow @Дао интерфейс PlayerDao { @Insert(onConflict = OnConflictStrategy.IGNORE) приостановить веселье upsertPlayer(игрок: Игрок) @Удалить приостановить веселье deletePlayer(player: Player) @Query("SELECT * FROM Player ORDER BY псевдо-ASC") забавный заказPlayersByPseudo(): Flow @Query("ВЫБРАТЬ * ИЗ ПОРЯДКА Игрока ПО лимкоинам ASC") забавный заказPlayersByLimcoins(): Flow @Query("SELECT * FROM Player WHERE псевдо LIKE :псевдо И пароль LIKE :пароль") fun getPlayerByNameAndPassword(псевдо: String, пароль: String): LiveData } MainActivity.kt пакет com.example.projetdevmob.ProjetUI импортировать android.content.Intent // Весь остальной импорт .. класс MainActivity : ComponentActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ProjetDevMobTheme { AuthPage (модификатор = Модификатор) } } } } // страница авторизации @OptIn(ExperimentalMaterial3Api::class) @Композитный забавная AuthPage (модификатор: Модификатор) { контекст val = LocalContext.current val playerDatabase = Room.databaseBuilder( контекст, AppDatabase::class.java, "playersDatabase" ).строить() var pseudoInput by Remember {mutableStateOf("Entrez votre pseudo") } varpasswordInput by Remember {mutableStateOf("Entrez votre mot de passe") } val coroutineScope = RememberCoroutineScope() val backgroundColor = Цвет (0xFFE9FAE9) val fontColor = Цвет (0xFF7BEA7B) val superFunkyFamily = FontFamily( Шрифт(R.font.superfunkyfont, FontWeight.Light), ) Столбец( вертикальное расположение = расположение.SpaceEvenly, HorizontalAlignment = Alignment.CenterHorizontally, модификатор = модификатор .fillMaxSize() .background(цвет фона) ) { Столбец( // Название игры ) { Текст( text = "Что нужно сделать", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) Текст( text = "дез миллиардов?", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) } Столбец( ) { Ряд( ГоризонтальноеРасположение = Расположение.Центр, модификатор = модификатор .fillMaxWidth() ) { Текстовое поле( значение = псевдовход, onValueChange = {псевдоВход = это}, метка = { Текст («Псевдо») }, textStyle = androidx.compose.ui.text.TextStyle( FontFamily = superFunkyFamily, размер шрифта = 13.sp, textAlign = TextAlign.Центр, ) ) } Ряд( ГоризонтальноеРасположение = Расположение.Центр, модификатор = модификатор .fillMaxWidth() .padding(низ = 30.dp) ) { Текстовое поле( значение = ввод пароля, onValueChange = { парольВвод = это }, label = { Text("Слово") }, textStyle = androidx.compose.ui.text.TextStyle( FontFamily = superFunkyFamily, размер шрифта = 13.sp, textAlign = TextAlign.Центр, ) ) } Ряд( HorizontalArrangement = Arrangement.SpaceEvenly, модификатор = модификатор .fillMaxWidth() ) { Кнопка( onClick = { coroutineScope.launch { // Выполнение операций с базой данных Room в фоновом режиме // Замените следующую строку фактическими операциями с базой данных Room playerDatabase.playerDao().upsertPlayer(Player(0, pseudoInput,passwordInput,500)) } }, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Зарегистрироваться", FontFamily = superFunkyFamily, размер шрифта = 10.sp, ) } Кнопка( onClick = { coroutineScope.launch { // Выполнение операций с базой данных Room в фоновом режиме // Замените следующую строку фактическими операциями с базой данных Room val player = playerDatabase.getPlayerByNameAndPassword(псевдоВход, парольВвод) если (игрок != ноль) { context.startActivity(Intent(context, NormalMode::class.java)) } еще { Toast.makeText(context, «Неверное выражение», Toast.LENGTH_SHORT).show() } } }, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Войти", FontFamily = superFunkyFamily, размер шрифта = 10.sp, ) } } } Ряд( горизонтальное расположение = Расположение.Центр ) { Кнопка( onClick = { Toast.makeText(context, "Подключение к Google", Toast.LENGTH_SHORT).show() }, цвета = ButtonDefaults.buttonColors( контейнерЦвет = Цвет (0xFF4285F4), contentColor = Цвет.Белый ), ) { Текст( text = "Войти через Google", FontFamily = superFunkyFamily, размер шрифта = 10.sp, ) } } } } /* @Preview(showBackground = true) @Композитный весело AuthPagePreview() { ProjetDevMobTheme { AuthPage("Android", playerViewModel = playerViewModel) } } */ NormalMode.kt пакет com.example.projetdevmob.ProjetUI импортировать android.os.Bundle импортировать android.widget.Toast импортировать androidx.activity.ComponentActivity импортировать androidx.activity.compose.setContent импортировать androidx.compose.foundation.Image импортировать androidx.compose.foundation.background импортировать androidx.compose.foundation.layout.* импортировать androidx.compose.material3.* импортировать androidx.compose.runtime.* импортировать androidx.compose.ui.Alignment импортировать androidx.compose.ui.Modifier импортировать androidx.compose.ui.graphics.Color импортировать androidx.compose.ui.platform.LocalContext импортировать androidx.compose.ui.res.painterResource импортировать androidx.compose.ui.text.font.Font импортировать androidx.compose.ui.text.font.FontFamily импортировать androidx.compose.ui.text.font.FontWeight импортировать androidx.compose.ui.tooling.preview.Preview импортировать androidx.compose.ui.unit.dp импортировать androidx.compose.ui.unit.sp импортировать com.example.projetdevmob.R импортировать com.example.projetdevmob.ui.theme.ProjetDevMobTheme импортировать kotlinx.coroutines.delay класс NormalMode : ComponentActivity() { переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ProjetDevMobTheme { // Поверхностный контейнер, использующий цвет фона из темы Поверхность (модификатор = Modifier.fillMaxSize (), цвет = MaterialTheme.colorScheme.background) { страница игры("Android") } } } } } // Страница игры @Композитный fun gamePage(имя: String, модификатор: Модификатор = Модификатор) { // Переменные и константы var limcoinsValue by Remember { mutableStateOf(500) } // VAR DE TEST, RECUPERER VALEUR DANS BASE DE DONNEES контекст val = LocalContext.current значение tempsMax = 60 var tempsRestant по памяти {mutableStateOf(tempsMax) } val backgroundColor = Цвет (0xFFE9FAE9) val fontColor = Цвет (0xFF7BEA7B) val superFunkyFamily = FontFamily( Шрифт(R.font.superfunkyfont, FontWeight.Light), ) // Индикаторы прогресса var currentProgress, запомнив {mutableStateOf(0f)} загрузка var по памяти {mutableStateOf(false)} область видимости = RememberCoroutineScope() // Элементы игры Столбец( HorizontalAlignment = Alignment.CenterHorizontally, вертикальное расположение = расположение.SpaceEvenly, модификатор = модификатор .fillMaxSize() .background(цвет фона) ) { Row( // Première ligne (compte à rebours et Limcoins) HorizontalArrangement = Arrangement.SpaceAround, модификатор = модификатор .fillMaxWidth() ) { Столбец( HorizontalAlignment = Alignment.CenterHorizontally, модификатор = модификатор .offset(y = (-10).dp) ) { LaunchedEffect(key1 = tempsRestant) { // Сопрограмма для восстановления данных в то время как (tempsRestant > 0){ задержка(1000л) tempsRestant-- } } Текст( text = "Оставшееся время: ", FontFamily = superFunkyFamily, размер шрифта = 13.sp, модификатор = модификатор ) Ряд( HorizontalArrangement = Arrangement.SpaceEvenly ) { Текст( текст = "$tempsRestant", FontFamily = superFunkyFamily, размер шрифта = 15.sp, ) ЦиркулярПрогрессИндикатор( прогресс = 1 - tempsRestant/tempsMax.toFloat(), цвет = цвет шрифта, модификатор = модификатор .size(25.dp) .padding(начало = 7.dp, верх = 4.dp) ) } } Столбец( модификатор = модификатор .offset(y = (-10).dp) ) { Текст( text = "Лимкоины: ", FontFamily = superFunkyFamily, размер шрифта = 13.sp, модификатор = модификатор ) Ряд() { Текст( текст = "$limcoinsValue", FontFamily = superFunkyFamily, размер шрифта = 15.sp, модификатор = модификатор ) Изображение( художник = PainterResource(R.drawable.limcoins), ContentDescription = ноль, модификатор = модификатор .size(25.dp) .padding(начало = 3.dp) ) } } } Столбец( // Название игры ) { Текст( text = "Что нужно сделать", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) Текст( text = "дез миллиардов?", цвет = цвет шрифта, размер шрифта = 20.sp, FontWeight = FontWeight.Жирный, FontFamily = superFunkyFamily, ) } Столбец( // Вопрос + ответы HorizontalAlignment = Alignment.CenterHorizontally, модификатор = модификатор ) { Текст( // Вопрос текст = "Вопрос", FontFamily = superFunkyFamily, размер шрифта = 15.sp, модификатор = модификатор ) Row( // Ответы 1 и 2 HorizontalArrangement = Arrangement.SpaceAround, модификатор = модификатор .fillMaxWidth() .padding(верх = 30.dp) ) { Кнопка( onClick = { Toast.makeText(context,"Ответ 1", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Ответ 1", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } Кнопка( onClick = { Toast.makeText(context,"Ответ 2", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Ответ 2", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } } Row( // Ответы 3 и 4 HorizontalArrangement = Arrangement.SpaceAround, модификатор = модификатор .fillMaxWidth() .padding(верх = 30.dp) ) { Кнопка( onClick = { Toast.makeText(context,"Ответ 3", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Color.Black), ) { Текст( текст = "Ответ 3", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } Кнопка( onClick = { Toast.makeText(context,"Ответ 4", Toast.LENGTH_SHORT).show()}, цвета = ButtonDefaults.buttonColors(containerColor = fontColor, contentColor = Цвет.Черный), ) { Текст( text = "Ответ 4", FontFamily = superFunkyFamily, размер шрифта = 13.sp, ) } } } Ряд( модификатор = модификатор ) { ЛинейныйПрогрессИндикатор( прогресс = 1 - tempsRestant/tempsMax.toFloat(), цвет = цвет шрифта, ) } } } @Preview(showBackground = true) @Композитный забавная играPagePreview() { ProjetDevMobTheme { страница игры("Android") } } build.gradle buildscript { доб. { compose_ui_version = '1.2.0' } } плагины { id 'com.android.application' версии '7.4.1' применить false id 'com.android.library' версии '7.4.1' применить false идентификатор «org.jetbrains.kotlin.android» версии «1.7.0» применить ложь } приложение/build.gradle плагины { идентификатор 'com.android.application' идентификатор 'org.jetbrains.kotlin.android' идентификатор 'котлин-андроид' идентификатор 'котлин-капт' } андроид { пространство имен «com.example.projetdevmob» скомпилироватьSdk 34 defaultConfig { идентификатор приложения «com.example.projetdevmob» минСдк 24 цельSdk 34 Код версии 1 Имя версии "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" векторDrawables { использоватьSupportLibrary true } } типы сборки { выпускать { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } компиляцияварианты { исходная совместимость JavaVersion.VERSION_1_8 целевая совместимость JavaVersion.VERSION_1_8 } котлинОпции { jvmTarget = '1,8' } buildFeatures { сочинять правду } composeOptions { kotlinCompilerExtensionVersion '1.2.0' } Варианты упаковки { Ресурсы { исключает += '/META-INF/{AL2.0,LGPL2.1}' } } } зависимости { реализация «androidx.core:core-ktx:1.7.0» реализация 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' реализация «androidx.activity:activity-compose:1.3.1» реализация "androidx.compose.ui:ui:$compose_ui_version" реализация "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" реализация 'androidx.compose.material:material:1.2.0' реализация 'androidx.compose.material3:material3:1.0.0-alpha08' реализация 'androidx.room:room-ktx:2.6.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version" реализация "androidx.room:room-runtime:2.4.0" kapt "androidx.room:room-compiler:2.4.0" } AndroidManifest.xml
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема удаления данных из базы данных помещений (Android Studio Java)
Anonymous » » в форуме Android - 0 Ответы
- 75 Просмотры
-
Последнее сообщение Anonymous
-