Андроид-приложение, 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)

Дрессировщик собак Кан Хёнук (강현욱) задаётся вопросом: чему отдаётся большее предпочтение при создании собачьего корма на фабриках — полезности продукта для собаки или удобству для её владельца? Ответ найти совсем не трудно...

Похожая проблема стоит и при создании еды для людей. Историк кулинарии Вильям Похлёбкин отмечал, что у магазинного хлеба корочка нарочито сделана толстой — для удобства транспортировки и продажи, чтобы буханки не повреждались от случайных ударов. В противовес этому энтуазиасты домашнего хлеба делают корочку тонкой, что никак не ухудшает питательные свойства готового продукта.

(Требуется фактчекинг.)

Офтопик: ненадлежащее (нетрадиционное, креативное, не предусмотренное изначально) использование элемента дизайна

Видеохостинг «Ютуб» не так давно скрыл количество дизлайков. Теперь дизлайк не может быть использован как своего рода орудие дискредитации в глазах общественности.

В сервисе «Ютуб музыка» в момент, когда пользователь ставит дизлайк видеоролику или аудиодорожке во время их воспроизведения, воспроизведение соответствующего видеоролика или аудиодорожки прекращается.

Очевидно, что функция «дизлайк» эволюционирует и её эволюция зависит не только от изначальных задумок дизайнера, но и от поведения пользователей.