Блог :: 07.03.2026 05:50:37 am
В Jetpack Compose есть несколько стандартных индикаторов загрузки:
Примеры их использования:
Дополнительные возможности настройки:
Можно также комбинировать индикаторы с другими компонентами, например:
Все эти компоненты автоматически анимируются и адаптируются под тему приложения.
CircularProgressIndicator: Классический круговой индикатор.LinearProgressIndicator: Линейный индикатор.ActivityIndicator: Простой вращающийся индикатор.
Примеры их использования:
ВыделитьKotlin
// Круговой индикатор
CircularProgressIndicator(
modifier = Modifier
.size(40.dp)
.padding(16.dp),
color = MaterialTheme.colorScheme.primary
)
// Линейный индикатор
LinearProgressIndicator(
progress = 0.5f, // значение от 0 до 1
modifier = Modifier
.height(4.dp)
.fillMaxWidth()
.padding(16.dp)
)
// Простой индикатор активности
ActivityIndicator(
modifier = Modifier
.size(40.dp)
.padding(16.dp),
color = MaterialTheme.colorScheme.primary
)Дополнительные возможности настройки:
- Изменение размера через модификатор
size(). - Настройка цвета через параметр
color. - Анимация прогресса для
LinearProgressIndicator. - Стилизация через темы Material Design.
Можно также комбинировать индикаторы с другими компонентами, например:
ВыделитьKotlin
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Загрузка данных...")
Spacer(modifier = Modifier.height(16.dp))
CircularProgressIndicator()
}Все эти компоненты автоматически анимируются и адаптируются под тему приложения.
- Жалоба
Блог :: 06.03.2026 09:06:33 am
В Kotlin можно получить часовой пояс пользователя несколькими способами.
Получение названия часового пояса
Получение смещения от UTC
...
Через TimeZone
ВыделитьKotlin
val timeZone = TimeZone.getDefault()
val timeZoneId = timeZone.id // например: "Europe/Moscow"
val offset = timeZone.rawOffset / (1000 * 60 * 60) // смещение в часахЧерез ZoneId (Рекомендуемый способ)
ВыделитьKotlin
import java.time.ZoneId
val zoneId = ZoneId.systemDefault()
val zoneIdString = zoneId.toString() // например: "Europe/Moscow"Через Calendar
ВыделитьKotlin
import java.util.Calendar
val calendar = Calendar.getInstance()
val timeZone = calendar.timeZone
val offset = timeZone.getRawOffset()Через LocalDateTime
import java.time.LocalDateTime
import java.time.ZoneId
val currentTime = LocalDateTime.now(ZoneId.systemDefault())Примеры использования
Получение названия часового пояса
ВыделитьKotlin
fun getUserTimeZone(): String {
return ZoneId.systemDefault().toString()
}Получение смещения от UTC
ВыделитьKotlin
fun getTimeZoneOffset(): Int {
val zone = TimeZone.getDefault()
return zone.getRawOffset() / (1000 * 60 * 60)
}Важные моменты
- Часовой пояс определяется автоматически на основе настроек устройства.
- Методы возвращают:
- Идентификатор часового пояса (например: “Europe/Moscow”).
- Смещение от UTC в часах.
- Информацию о переходе на летнее время.
Пример полного использования
ВыделитьKotlin
fun main() {
val zoneId = ZoneId.systemDefault()
println("Часовой пояс: $zoneId")
val timeZone = TimeZone.getDefault()
Блог :: 27.02.2026 06:35:55 am
Функция println() является стандартной конструкцией в языке Kotlin, позволяющей выводить значения и выражения в консольный поток вывода. Ее название расшифровывается как «
В этой статье мы детально рассмотрим особенности использования функции
Основная форма записи функции
Параметр
Пример:
Результатом выполнения будет вывод в консоли следующей строки:
1. Вывод чисел и арифметических выражений:
2. Вывод строки с конкатенацией значений:
...
print line» («напечатать строку»), подразумевая, что после каждого вызова происходит автоматический перенос каретки на новую строку.В этой статье мы детально рассмотрим особенности использования функции
println(), ее синтаксис, варианты применения и лучшие практики.Синтаксис и базовые примеры
Основная форма записи функции
println() следующая:
ВыделитьKotlin
println([value])Параметр
[value] необязателен и может содержать любое выражение или литеральное значение. Если аргумент отсутствует, то просто выводится новая строка.Пример:
ВыделитьKotlin
println("Hello, World!")Результатом выполнения будет вывод в консоли следующей строки:
Hello, World!
Особенности функции println()
- Автоматический перенос строки: После каждого вызова
println()происходит переход на новую строку. - Возможность вывода любых выражений: Можно передавать в качестве аргументов числа, строки, объекты, результаты вычислений и другие типы данных.
- Строковое представление объектов: Если передается объект, он автоматически преобразуется в строку посредством вызова метода
toString().
Несколько примеров использования
1. Вывод чисел и арифметических выражений:
ВыделитьKotlin
val a = 10
val b = 20
println(a + b) // Выведет число 302. Вывод строки с конкатенацией значений:
ВыделитьKotlin
val firstName = "John"
val lastName = "Doe"
println("$firstName
Блог :: 26.02.2026 08:45:54 pm
Блог :: 26.02.2026 12:02:46 pm
В Jetpack Compose есть несколько способов уменьшить расстояние между строками в тексте:
Через параметр lineSpacing в TextStyle:
Через lineHeight в TextStyle:
Для Column (если речь про расстояние между элементами):
Для LazyColumn или LazyRow:
Для нескольких Text в Column:
Важные моменты:
Вы можете комбинировать эти методы в зависимости от конкретной задачи и структуры вашего интерфейса.
Через параметр lineSpacing в TextStyle:
ВыделитьKotlin
Text(
text = "Ваш текст",
style = TextStyle(
lineSpacing = 1.2f // значение меньше 1 уменьшит расстояние
)
)Через lineHeight в TextStyle:
ВыделитьKotlin
Text(
text = "Ваш текст",
style = TextStyle(
lineHeight = 20.sp // задайте конкретное значение в sp
)
)Для Column (если речь про расстояние между элементами):
ВыделитьKotlin
Column(
verticalArrangement = Arrangement.spacedBy(8.dp) // задайте нужное расстояние
) {
Text("Строка 1")
Text("Строка 2")
}Для LazyColumn или LazyRow:
ВыделитьKotlin
LazyColumn(
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(itemsList) { item ->
Text(item.text)
}
}Для нескольких Text в Column:
ВыделитьKotlin
Column {
Text("Первая строка")
Spacer(modifier = Modifier.height(4.dp)) // задайте нужное значение
Text("Вторая строка")
}Важные моменты:
- lineSpacing — относительное значение (коэффициент)
- lineHeight — абсолютное значение в sp
- spacedBy — для расстояний между элементами в Column/Row
- Spacer — для ручного задания отступов
Вы можете комбинировать эти методы в зависимости от конкретной задачи и структуры вашего интерфейса.
Блог :: 26.02.2026 07:17:30 am
Разработчики Android нередко сталкиваются с путаницей относительно использования различных версий класса
Класс R представляет собой специальную структуру, автоматически создаваемую Android Studio во время процесса сборки проекта. Он служит контейнером ссылок на ресурсы вашего приложения (изображения, цвета, стили, макеты и т.д.). Каждый ресурс автоматически получает уникальный числовой идентификатор, хранящийся в соответствующих полях класса
Классы R бывают двух типов:
Что это?Это главный класс ресурсов вашего собственного приложения. Здесь хранятся идентификаторы всех ресурсов, размещённых в директории
Как используется?
Используя класс
Что это?Библиотека Material...
R, особенно когда речь идет о доступе к ресурсам своего приложения и сторонних библиотек. Эта статья поможет разобраться в разнице между app.R и com.google.android.material.R, а также научит правильно обращаться к нужным ресурсам.Что такое классы R?
Класс R представляет собой специальную структуру, автоматически создаваемую Android Studio во время процесса сборки проекта. Он служит контейнером ссылок на ресурсы вашего приложения (изображения, цвета, стили, макеты и т.д.). Каждый ресурс автоматически получает уникальный числовой идентификатор, хранящийся в соответствующих полях класса
R.Классы R бывают двух типов:
- Ваш собственный класс
R, называемыйapp.R, соответствует ресурсам вашего проекта. - Класс R сторонней библиотеки, обозначаемый именем пакета библиотеки (например,
com.google.android.material.R), содержит ссылки на ресурсы конкретной внешней библиотеки.
app.R
Что это?Это главный класс ресурсов вашего собственного приложения. Здесь хранятся идентификаторы всех ресурсов, размещённых в директории
/res/ вашего проекта. Все строки, цвета, размеры, рисунки и прочее хранится именно тут.Как используется?
Используя класс
app.R, вы обращаетесь к собственным ресурсам приложения:
ВыделитьKotlin
setBackgroundColor(ContextCompat.getColor(context, R.color.my_color))
setImageResource(R.drawable.ic_launcher_background)com.google.android.material.R
Что это?Библиотека Material...
Блог :: 24.02.2026 07:31:31 am
При разработке приложений на Android с использованием Jetpack Compose и стандартных подходов на основе Activity/Fragments вы можете столкнуться с двумя разными способами получения строковых ресурсов: функцией stringResource() и методом getString(). Оба способа служат схожей цели — получают строку из ресурсов проекта, однако имеют разное назначение и области применения.
stringResource()
Пример использования:
getString()
Пример использования:
...
Функционал и различия
stringResource()
- Назначение: Используется в рамках композиции Composable-функций Jetpack Compose.
- Где применяется: Только внутри функций с аннотацией
@Composable. - Формат: Выглядит как простая функция, принимающая ID ресурса:
stringResource(R.string.your_string_id). - Импорт: Необходимо подключить следующий импорт:
ВыделитьKotlin
import androidx.compose.ui.res.stringResource
Пример использования:
ВыделитьKotlin
@Composable
fun MyScreen() {
Text(text = stringResource(R.string.welcome_message))
}getString()
- Назначение: Применяется вне контекста Compose-композиций, например, в обычных Activity, Fragment или ViewModels.
- Где применяется: Внутри классов наследников от Context, AppCompatActivity, Fragments и других компонент, поддерживающих ресурсный контекст.
- Формат: Методы
getString()относятся непосредственно к объекту контекста, например:context.getString(R.string.your_string_id)или activity.getString(R.string.your_string_id). - Импорт: Стандартный импорт ресурсов не нужен, поскольку метод доступен напрямую в классе Context и производных от него объектах.
Пример использования:
ВыделитьKotlin
class
Блог :: 23.02.2026 05:49:27 am
В Kotlin (особенно при работе с корутинами и асинхронными операциями) часто встречаются конструкции onSuccess и onError. Они служат для обработки результатов асинхронных операций — как успешных, так и ошибочных.
Это лямбда‑функции (callback-обработчики), которые:
Они позволяют отделить логику обработки результата от самого выполнения операции.
Чаще всего встречаются в:
Базовый синтаксис
Сетевой запрос (Retrofit)
Корутины с async
...
Что это такое?
Это лямбда‑функции (callback-обработчики), которые:
onSuccess— вызывается при успешном завершении операции;onError— вызывается при возникновении ошибки.
Они позволяют отделить логику обработки результата от самого выполнения операции.
Где применяются
Чаще всего встречаются в:
- сетевых запросах (Retrofit, Ktor);
- работе с БД (Room, SQLDelight);
- корутинах (async, await);
- RxJava/RxKotlin;
- библиотеках для работы с файлами/IO.
Базовый синтаксис
ВыделитьKotlin
someAsyncOperation(
onSuccess = { result ->
// Обработка успешного результата
},
onError = { exception ->
// Обработка ошибки
}
)Практические примеры
Сетевой запрос (Retrofit)
ВыделитьKotlin
apiService.getUser(userId)
.enqueue(object : Callback<User> {
override fun onResponse(call: Call<User>, response: Response<User>) {
if (response.isSuccessful) {
onSuccess(response.body()!!)
} else {
onError(HttpException(response))
}
}
override fun onFailure(call: Call<User>, t: Throwable) {
onError(t)
}
})Корутины с async
ВыделитьKotlin
scope.launch {
val deferred = async {
fetchDataFromNetwork()
}
try {
val result =
Блог :: 22.02.2026 07:31:37 pm
Решение о хранении ID пользователя на устройстве зависит от контекста и требований к безопасности:
- Плюсы: Хранение ID может упростить аутентификацию и улучшить пользовательский опыт, так как не потребуется каждый раз вводить логин/пароль.
- Риски: Если ID будет скомпрометирован (например, при утечке данных или взломе устройства), это может привести к несанкционированному доступу к аккаунту пользователя. Особенно критично, если ID используется в качестве уникального идентификатора без дополнительных мер защиты.
- Альтернативы: Вместо хранения ID можно использовать токены или сессии с ограниченным сроком действия. Также можно реализовать двухфакторную аутентификацию или биометрическую проверку при каждом входе.
Рекомендации по повышению безопасности
- Используйте надёжные алгоритмы шифрования и безопасные ключи: Ключи должны генерироваться случайным образом и храниться в защищённом хранилище (например, Android Keystore).
- Ограничьте доступ к данным: Убедитесь, что к зашифрованным данным нет доступа из других приложений или извне. Используйте механизмы изоляции, предоставляемые операционной системой.
- Регулярно обновляйте приложение и ОС: Это поможет закрыть уязвимости, которые могут быть использованы для доступа к данным.
- Реализуйте дополнительные меры защиты: Например, двухфакторную аутентификацию, биометрическую проверку, ограничение срока действия токенов.
- Проводите аудит безопасности: Регулярно проверяйте код на наличие уязвимостей, используйте инструменты статического и динамического
Блог :: 22.02.2026 07:25:52 pm
Шифрование токена и его сохранение во внутреннем хранилище приложения повышает уровень безопасности данных по сравнению с хранением в открытом виде. Однако степень защиты зависит от ряда факторов, и нельзя однозначно утверждать, что это полностью обезопасит пользователя. Рассмотрим ключевые аспекты.
Если токен зашифрован надёжным алгоритмом (например, AES-256) и ключи шифрования хранятся безопасно (например, в Android Keystore), это значительно усложняет доступ к данным для злоумышленника. Внутреннее хранилище приложения по умолчанию приватно: другие приложения и пользователь не могут получить к нему доступ без root-прав или эксплойтов.
Однако важно учитывать:
Шифрование токена и его хранение во внутреннем хранилище — это шаг в...
О шифровании токена
Если токен зашифрован надёжным алгоритмом (например, AES-256) и ключи шифрования хранятся безопасно (например, в Android Keystore), это значительно усложняет доступ к данным для злоумышленника. Внутреннее хранилище приложения по умолчанию приватно: другие приложения и пользователь не могут получить к нему доступ без root-прав или эксплойтов.
Однако важно учитывать:
- Риск рутирования устройства: Если устройство рутировано, злоумышленник может получить доступ к файлам приложения, включая зашифрованные данные.
- Уязвимости в реализации шифрования: Ошибки в коде (например, использование слабого ключа или его небезопасное хранение) могут сделать шифрование неэффективным.
- Физическая компрометация устройства: При прямом доступе к устройству (например, при краже) данные могут быть извлечены, даже если они зашифрованы. Здесь поможет только блокировка экрана с паролем/PIN-кодом и/или полное шифрование памяти устройства.
- Атаки на время выполнения или побочные каналы: В редких случаях злоумышленник может попытаться извлечь ключи или данные через анализ времени работы алгоритмов или других побочных эффектов.
Шифрование токена и его хранение во внутреннем хранилище — это шаг в...
Блог :: 19.02.2026 03:55:03 pm
Операционная система Android стала одной из самых популярных платформ для мобильных устройств благодаря своей открытости и гибкости разработки приложений. Чтобы создать приложение для Android, разработчик может выбрать среди множества языков программирования. Рассмотрим самые распространенные из них.
Java была основным языком программирования для Android вплоть до появления Kotlin. Многие существующие приложения написаны именно на Java. Несмотря на возраст, этот язык остается актуальным благодаря широкой поддержке библиотек и инструментариев. Если вы хотите начать разработку под Android, знание Java обязательно пригодится вам.
Kotlin стал официальным языком Android-разработки начиная с версии Android Studio 3.0. Этот язык прост в освоении, лаконичен и совместим с Java, что облегчает переход разработчиков с Java на Kotlin. Благодаря своим преимуществам, таким как поддержка функций высшего порядка и корутин, Kotlin быстро завоевал популярность среди разработчиков.
Хотя Java и Kotlin являются основными языками Android-приложений, некоторые части приложения могут быть реализованы на языках C/C++. Эти языки часто используются для написания высокопроизводительных компонентов, таких как игры или графические библиотеки. Для интеграции C/C++ с Android используется Native Development Kit (NDK).
Flutter — это открытый кросс-платформенный SDK от Google, позволяющий создавать нативные мобильные приложения на Dart. Приложения, созданные с помощью Flutter,...
Java
Java была основным языком программирования для Android вплоть до появления Kotlin. Многие существующие приложения написаны именно на Java. Несмотря на возраст, этот язык остается актуальным благодаря широкой поддержке библиотек и инструментариев. Если вы хотите начать разработку под Android, знание Java обязательно пригодится вам.
Kotlin
Kotlin стал официальным языком Android-разработки начиная с версии Android Studio 3.0. Этот язык прост в освоении, лаконичен и совместим с Java, что облегчает переход разработчиков с Java на Kotlin. Благодаря своим преимуществам, таким как поддержка функций высшего порядка и корутин, Kotlin быстро завоевал популярность среди разработчиков.
C/C++
Хотя Java и Kotlin являются основными языками Android-приложений, некоторые части приложения могут быть реализованы на языках C/C++. Эти языки часто используются для написания высокопроизводительных компонентов, таких как игры или графические библиотеки. Для интеграции C/C++ с Android используется Native Development Kit (NDK).
Flutter/Dart
Flutter — это открытый кросс-платформенный SDK от Google, позволяющий создавать нативные мобильные приложения на Dart. Приложения, созданные с помощью Flutter,...
Блог :: 19.02.2026 12:34:20 pm
Определить тип HTTP-запроса (POST или GET) в PHP можно несколькими способами:
Использование суперглобального массива $_SERVER
Использование константы PHP_SAPI (менее надёжный способ)
Через функцию filter_input
Проверка наличия данных POST
Проверка через php_input
Основные способы определения метода запроса
Использование суперглобального массива $_SERVER
ВыделитьPHP
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
// Обработка GET-запроса
} elseif ($method === 'POST') {
// Обработка POST-запроса
}Использование константы PHP_SAPI (менее надёжный способ)
ВыделитьPHP
if (php_sapi_name() === 'cgi-fcgi' && $_SERVER['REQUEST_METHOD'] === 'POST') {
// POST-запрос
}Через функцию filter_input
ВыделитьPHP
$method = filter_input(INPUT_SERVER, 'REQUEST_METHOD');Практическое применение
ВыделитьPHP
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
// Обработка GET-запроса
$data = $_GET;
break;
case 'POST':
// Обработка POST-запроса
$data = $_POST;
break;
default:
http_response_code(405); // Метод не разрешён
echo 'Метод запроса не поддерживается';
break;
}Дополнительные методы проверки
Проверка наличия данных POST
ВыделитьPHP
if (!empty($_POST)) {
// Вероятно, POST-запрос
}Проверка через php_input
ВыделитьPHP
if (fopen('php://input', 'r')) {
// Возможно POST-запрос
}Рекомендации по использованию
- Основной способ — использование
$_SERVER['REQUEST_METHOD']. - Валидация данных всегда должна производиться дополнительно, независимо от метода запроса.
- Безопасность: не доверяйте только типу запроса, проверяйте все входные данные.
- Обработ
Блог :: 15.02.2026 08:18:07 pm
Одним из важнейших этапов разработки и сопровождения API является обеспечение надежной диагностики ошибок. Качественные и информативные ответы от сервера позволяют разработчикам быстро находить и устранять проблемы, улучшают удобство работы с сервисом и повышают доверие пользователей.
В статье рассмотрены лучшие практики и примеры диагностики ошибок через API, позволяющие эффективно решать возникающие проблемы.
Четкая структура ответа
Четко организованные ответы делают общение с клиентами простым и понятным. Например, ответ должен включать:
Пример ответа в формате JSON:
Подробные сообщения об ошибках
Помимо статуса ошибки, предоставляйте развернутое сообщение, объясняющее причину произошедшего. Например:
Использование HTTP-кодов
Правильное использование HTTP-кодов позволяет более точно охарактеризовать произошедшую ошибку. Например:
В статье рассмотрены лучшие практики и примеры диагностики ошибок через API, позволяющие эффективно решать возникающие проблемы.
Основные принципы эффективной диагностики ошибок
Четкая структура ответа
Четко организованные ответы делают общение с клиентами простым и понятным. Например, ответ должен включать:
- Статус операции (
status); - Информационное сообщение (
message); - При необходимости — дополнительные данные (
data).
Пример ответа в формате JSON:
ВыделитьJSON
{
"status": "error",
"message": "Пользователь с таким email уже зарегистрирован.",
"data": {}
}Подробные сообщения об ошибках
Помимо статуса ошибки, предоставляйте развернутое сообщение, объясняющее причину произошедшего. Например:
ВыделитьPHP
header('Content-Type: application/json');
echo json_encode([
'status' => 'error',
'message' => 'Ошибка базы данных: '.$stmt->error
]);Использование HTTP-кодов
Правильное использование HTTP-кодов позволяет более точно охарактеризовать произошедшую ошибку. Например:
- 400 (Bad Request) — если данные переданы неверно;
- 401 (Unauthorized) — если пользователь не прошел авторизацию;
- 404 (Not Found) — если ресурс не найден;
- 500 (Internal Server Error) — если произошла внутренняя ошибка
Блог :: 14.02.2026 09:45:19 am
Аннотация
1. Создание пользовательского интерфейса
Если функция должна выводить что-то на экран, она должна быть помечена аннотацией:
2. Вложенные композиционные функции
Если функция вызывает другие композиционные функции, она также должна быть помечена аннотацией
3. Функции, которые изменяют состояние
Если функция изменяет состояние (например, с помощью
Простой текст:
Кнопка с текстом:
Сложный интерфейс:
...
@Composable в Jetpack Compose используется для обозначения функций, которые могут создавать и обновлять пользовательский интерфейс. Эти функции называются композиционными функциями и могут содержать код, который описывает, как должен выглядеть пользовательский интерфейс.Когда использовать @Composable
1. Создание пользовательского интерфейса
Если функция должна выводить что-то на экран, она должна быть помечена аннотацией:
@Composable:
ВыделитьKotlin
@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}2. Вложенные композиционные функции
Если функция вызывает другие композиционные функции, она также должна быть помечена аннотацией
@Composable:
ВыделитьKotlin
@Composable
fun Content() {
Greeting(name = "Kotlin")
}3. Функции, которые изменяют состояние
Если функция изменяет состояние (например, с помощью
remember), она должна быть помечена аннотацией @Composable:
ВыделитьKotlin
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Count: $count")
}
}Примеры
Простой текст:
ВыделитьKotlin
@Composable
fun SimpleText() {
Text("Hello, Compose!")
}Кнопка с текстом:
ВыделитьKotlin
@Composable
fun ButtonWithText() {
Button(onClick = { /* Обработка клика */ }) {
Text("Click me!")
}
}Сложный интерфейс:
ВыделитьKotlin
@Composable
fun ComplexUI() {
Column {
Text("Title")
Button(onClick = { /* Обработка клика */ }) {
Блог :: 14.02.2026 06:29:03 am
Врера, потребовалось воспользоваться
Чтобы решить, вместо этого:
Я использовал это:
Это безотказный вариант. Сегодня я попробовал вставить:
И всё было определенно.
Возможно потребуется импорт:
BuildConfig.VERSION_NAME для получения версии приложения, но она отказалась быть определённой.Чтобы решить, вместо этого:
ВыделитьKotlin
val versionApp = BuildConfig.VERSION_NAMEЯ использовал это:
Выделитьkotlin
val versionApp = try {
context.packageManager.getPackageInfo(context.packageName, 0).versionName
} catch (_: Exception) {
null
}Это безотказный вариант. Сегодня я попробовал вставить:
ВыделитьKotlin
val versionApp = BuildConfig.VERSION_NAMEИ всё было определенно.
Возможно потребуется импорт:
ВыделитьKotlin
import net.danfa.rush.BuildConfig
Блоги
В Jetpack Compose есть несколько стандартных индикаторов загрузки:
CircularProgressIndicator: Классический круговой...
В Kotlin можно получить часовой пояс пользователя несколькими способами.
Через TimeZone
val timeZone = TimeZone.getDefault()
val timeZoneId =...
Функция println() является стандартной конструкцией в языке Kotlin, позволяющей выводить значения и выражения в консольный поток вывода. Ее название...
Темы
6 ответов
6 ответов
1 ответ
3 ответа
Ссылки
Web Мастерская
Сообщество Web Мастеров. Тут собрано всё, чтобы написать свой первый сайт,...
Реклама






