Андроид-приложение, 46-я неделя
Обновлено 26 января 2024 года.
Создание макета приложения
После создания слоя данных и слоя пользовательского интерфейса создаю макет приложения.
Макет определяется исключительно кодом, с помощью компо́усэблов.
В пакете «ю-ай» (ui, user interface, пользовательский интерфейс) приложения «Марс фо́тос» (MarsPhotos, «Фотографии Марса») расположился главный компо́усэбэл, который был назван «Марс фо́тос апп» (MarsPhotosApp). Я решил назвать этот компо́усэбэл по-другому в приложении «Амфи́бианс» (Amphibians, «Амфибии» («Земноводные»)):
package com.example.amphibians.ui import androidx.compose.runtime.Composable @Composable fun AmphibiansLayout() { ... }
Для верхней панели я выбираю интересующее меня поведение при скролле:
@file:OptIn(ExperimentalMaterial3Api::class) package com.example.amphibians.ui import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.TopAppBarDefaults ... fun AmphibiansLayout() { val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() }
Поведение при скролле понадобится мне позже. Пока что создаю основные компоусэблы. Они будут в пакете «скринс» (screens, экраны). Пример:
package com.example.amphibians.ui.screens import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.amphibians.R @Composable fun HomeScreen( amphibiansUiState: AmphibiansUiState, modifier: Modifier = Modifier ) { when (amphibiansUiState) { is AmphibiansUiState.Error -> ErrorScreen() is AmphibiansUiState.Loading -> LoadingScreen() is AmphibiansUiState.Success -> AmphibiansCatalog() } } @Composable fun AmphibiansCatalog() {} @Composable fun LoadingScreen() {} @Composable fun ErrorScreen() { Text(text = stringResource(id = R.string.app_name)) }
Компо́усэбэл «Хо́ум скрин» (HomeScreen) я «экспортирую» в компо́усэбэл «Амфи́бианс лэй-а́ут» (AmphibiansLayout), а сам компо́усэбэл «Амфи́бианс лэй-а́ут» — в «он криэйт» (onCreate). Пример:
... import androidx.lifecycle.viewmodel.compose.viewModel import com.example.amphibians.ui.screens.AmphibiansViewModel import com.example.amphibians.ui.screens.HomeScreen @Composable fun AmphibiansLayout() { ... val amphibiansViewModel: AmphibiansViewModel = viewModel(factory = AmphibiansViewModel.Factory) HomeScreen(amphibiansUiState = amphibiansViewModel.amphibiansUiState) }
В эмуляторе я включаю авиарежим и только потом загружаю приложение...
Ссылки на официальную документацию
- Для поддержки третьей версии «Материального дизайна»: перечень соответствующих выпусков фреймворка «Компо́ус».
- Компо́усэбэл «Ска́ффольд» (Scaffold, «Леса́»).
- Какие типы, свойства, функции предоставляет пакет «андро́ид-экс . компо́ус . мате́риал-три».
Итоговый код приложения «Амфибии»
Для приложения «Амфибии» авторы курса дают итоговый код.
Офтопик: софт и значение его исходного кода
Исходный код своего сайта «Уроки чувашского языка» (ХТМЛ-код и ЦСС-код) я писал слишком давно, чтобы помнить, что означает каждая его часть, — а ведь это проблема!
Значение (семантика?) исходного кода компьютерных программ могло бы оставаться ясным долгое время, если бы соблюдался принцип «одного источника истины» — тот принцип, который, кстати, соблюдён фреймворком «Компо́ус»!..
Конкретные дизайнерские (проектировочные) решения могли бы быть записаны на языке лисп или пролог. Существуют, конечно, специализированные — доменные — языки, но есть мнение, что они неоправданно усложняют разработку...
Офтопик: дизайн пищи (food design)
Дрессировщик собак Кан Хёнук (강현욱) задаётся вопросом: чему отдаётся большее предпочтение при создании собачьего корма на фабриках — полезности продукта для собаки или удобству для её владельца? Ответ найти совсем не трудно...
Похожая проблема стоит и при создании еды для людей. Историк кулинарии Вильям Похлёбкин отмечал, что у магазинного хлеба корочка нарочито сделана толстой — для удобства транспортировки и продажи, чтобы буханки не повреждались от случайных ударов. В противовес этому энтуазиасты домашнего хлеба делают корочку тонкой, что никак не ухудшает питательные свойства готового продукта.
(Требуется фактчекинг.)
Офтопик: ненадлежащее (нетрадиционное, креативное, не предусмотренное изначально) использование элемента дизайна
Видеохостинг «Ютуб» не так давно скрыл количество дизлайков. Теперь дизлайк не может быть использован как своего рода орудие дискредитации в глазах общественности.
В сервисе «Ютуб музыка» в момент, когда пользователь ставит дизлайк видеоролику или аудиодорожке во время их воспроизведения, воспроизведение соответствующего видеоролика или аудиодорожки прекращается.
Очевидно, что функция «дизлайк» эволюционирует и её эволюция зависит не только от изначальных задумок дизайнера, но и от поведения пользователей.