Добавить в корзинуПозвонить
Найти в Дзене
КвадроKot

8. Часы на Kotlin?

Привет! Давайте создадим простое приложение "Часы" на Kotlin в Android Studio. Я разобью процесс на шаги с подробными пояснениями. //---------------------------------------------- <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.clockapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ClockApp"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Оглавление

Привет! Давайте создадим простое приложение "Часы" на Kotlin в Android Studio. Я разобью процесс на шаги с подробными пояснениями.

1. Файл манифеста (AndroidManifest.xml).

//----------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.clockapp">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ClockApp"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
//----------------------------------------------

Пояснение:

  • package - уникальный идентификатор вашего приложения.
  • application - корневой элемент приложения.
  • activity - определяет экран приложения.
  • intent-filter с действием MAIN и категорией LAUNCHER делает активность стартовой.

2. Разметка (activity_main.xml).

//----------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/timeTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="48sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
//----------------------------------------------

Пояснение:

  • ConstraintLayout - гибкий макет для позиционирования элементов.
  • TextView будет отображать время.
  • Атрибуты constraint... центрируют текст.

3. Код активности (MainActivity.kt).

//----------------------------------------------

package com.example.clockapp

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.text.SimpleDateFormat
import java.util.*

class MainActivity : AppCompatActivity() {
private lateinit var timeTextView: TextView
private val handler = Handler(Looper.getMainLooper())
private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.
activity_main)

timeTextView = findViewById(R.id.
timeTextView)
}

private val updateTimeTask = object : Runnable {
override fun run() {
val currentTime = Date()
timeTextView.
text = timeFormat.format(currentTime)
handler.postDelayed(this, 1000)
// Повтор каждую секунду
}
}

override fun onResume() {
super.onResume()
handler.post(updateTimeTask)
// Запускаем обновление при возобновлении
}

override fun onPause() {
super.onPause()
handler.removeCallbacks(updateTimeTask)
// Останавливаем при паузе
}
}
//----------------------------------------------

Пояснение кода:

  1. onCreate():
    - Устанавливает макет.
    - Находит TextView по ID.
  2. updateTimeTask:
    - Runnable-объект для обновления времени.
    - Форматирует текущее время в формат "часы:минуты:секунды".
    - Обновляет текст каждую секунду с помощью Handler.
  3. onResume() и onPause():
    - Запускают и останавливают обновление времени.
    - Оптимизируют потребление ресурсов.

4. Как это работает:

  1. Приложение запускает MainActivity.
  2. TextView центрируется на экране.
  3. Handler запускает периодическое обновление.
  4. SimpleDateFormat преобразует системное время в строку.
  5. Обновление происходит каждую секунду (1000 мс).

5. Важные моменты.

  • Handler используется для работы с основным потоком UI.
  • Looper.getMainLooper() обеспечивает выполнение в главном потоке.
  • SimpleDateFormat задает формат отображения времени.
  • Учет жизненного цикла активности (onResume/onPause) предотвращает утечки памяти.

6. Советы для улучшения.

  • Добавить дату.
  • Сменить цвет фона.
  • Добавить анимацию обновления.
  • Реализовать разные форматы времени (12/24 часа).

Это базовый пример, который можно запустить на любом устройстве с Android 5.0 (API 21) и выше. Для работы приложения не требуются дополнительные разрешения.