프로그래밍/안드로이드(코틀린)

안드로이드 1 - 스톱워치 기능 만들기 예제

가카리 2024. 8. 25. 21:09
반응형

 

 

아래와 같은 스톱워치를 만들어보자

 

 

 

build.gradle.kts(Module)

  - 원래 소스에 아래 문장을 추가해 준것 밖에 없음 .

viewBinding.isEnabled = true

 

 

 

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.example.ch8_3"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.ch8_3"
        minSdk = 34
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }

    viewBinding.isEnabled = true

}

dependencies {

    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    implementation(libs.androidx.activity)
    implementation(libs.androidx.constraintlayout)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
}

 

 

 

activity_main.xml

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

    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:gravity="center_horizontal"
        android:textSize="60dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="70dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <Button
            android:id="@+id/startButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="Start"
            android:textColor="#FFFFFF"
            android:textStyle="bold"
            />
        <Button
            android:id="@+id/stopButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="25dp"
            android:enabled="false"
            android:text="Stop"
            android:textColor="#FFFFFF"
            android:textStyle="bold"/>

        <Button
            android:id="@+id/resetButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="25dp"
            android:enabled="false"
            android:text="Reset"
            android:textColor="#FFFFFF"
            android:textStyle="bold"/>

    </LinearLayout>


</RelativeLayout>

 

 

MainActivity.kt

 

package com.example.ch8_3

import android.os.Bundle
import android.os.SystemClock
import android.view.KeyEvent
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.ch8_3.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    //뒤로 가기 버튼을 누른 시각을 저장하는 속성
    var initTime = 0L

    //멈춘 시각을 저장하는 속성
    var pauseTime = 0L

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)

        setContentView(binding.root)
        //start버튼이 눌렸을때 리스너
        binding.startButton.setOnClickListener{
            binding.chronometer.base = SystemClock.elapsedRealtime() + pauseTime
            binding.chronometer.start()
            //버튼 표시 여부 조정
            binding.stopButton.isEnabled = true //버튼 enable 처리
            binding.resetButton.isEnabled = true
            binding.startButton.isEnabled = false
        }

        //stop버튼이 눌렸을때 리스너
        binding.stopButton.setOnClickListener{
            pauseTime = binding.chronometer.base - SystemClock.elapsedRealtime()
            //현재 시점에서 크로노미터가 시작된 시점을 빼서, 크로노미터가 경과한 시간을 계산합니다.

            binding.chronometer.stop()  //멈춤
            binding.stopButton.isEnabled = false  //버튼 enable 처리
            binding.resetButton.isEnabled = true
            binding.startButton.isEnabled = true
        }

        //reset버튼이 눌렸을때 리스너
        binding.resetButton.setOnClickListener{
            pauseTime = 0L  //초기화함
            binding.chronometer.base = SystemClock.elapsedRealtime()  //시스템 시간을 가져옴
            binding.chronometer.stop()
            binding.stopButton.isEnabled = false //버튼 enable 처리
            binding.resetButton.isEnabled = false
            binding.startButton.isEnabled = true
        }

    }
    //뒤로가기 버튼 핸들러

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        //뒤로가기 버튼을 눌렀을 때 처리
        if (keyCode === KeyEvent.KEYCODE_BACK){
            
            //뒤로가기 버튼을 처음 눌렀거나 누른지 3초가 지났을 때 처리
            if(System.currentTimeMillis() - initTime > 3000){
                Toast.makeText(this, "종료하려면 한번 더 누르세요",
                    Toast.LENGTH_SHORT).show()
                initTime = System.currentTimeMillis()
                return true
            }
        }

        return super.onKeyDown(keyCode, event)
    }

}

 

 

 

출처 : https://kkangsnote.tistory.com/