Basic

스톱워치 앱 구현하기

wdadaww 2022. 12. 2. 13:31
  • ActivityMain.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">


    <Chronometer
        android:id="@+id/time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="center_horizontal"
        android:textSize="60dp"
        app:layout_constraintTop_toTopOf="parent">

    </Chronometer>

    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_marginBottom="70dp"
        android:foregroundGravity="center_horizontal"
        android:orientation="horizontal"

        >

        <Button
            android:id="@+id/startbtn"
            android:text="START"
            android:layout_marginEnd="20dp"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toStartOf="@id/text"
            app:layout_constraintTop_toBottomOf="@id/text">


        </Button>

        <Button
            android:text="Stop"
            android:id="@+id/Stopbtn"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="15dp"
            app:layout_constraintEnd_toEndOf="@id/text"
            app:layout_constraintTop_toBottomOf="@id/text">

        </Button>

        <Button
            android:id="@+id/Resetbtn"
            android:text="Reset"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toEndOf="@id/text"
            app:layout_constraintTop_toBottomOf="@id/text">

        </Button>

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="버튼을 클릭하세요"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


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

 

  • MainActivity.kt
package com.example.stopwatch

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

class MainActivity : AppCompatActivity() {

    var initime = 0L
    var pausetime = 0L

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

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.startbtn.setOnClickListener({
            binding.time.base = SystemClock.elapsedRealtime() + pausetime
            binding.time.start()

            binding.Stopbtn.isEnabled = true
            binding.startbtn.isEnabled = false
            binding.Resetbtn.isEnabled = true


        })
        binding.Stopbtn.setOnClickListener({

            pausetime = binding.time.base - SystemClock.elapsedRealtime()
            binding.time.stop()
            //데이터 타입 사용할수있는지 검사
            binding.Stopbtn.isEnabled = false
            binding.startbtn.isEnabled = true
            binding.Resetbtn.isEnabled = true


        })
        binding.Resetbtn.setOnClickListener({

            pausetime = 0L
            binding.time.base = SystemClock.elapsedRealtime()
            binding.time.stop()
            //데이터 타입 사용할수있는지 검사
            binding.Stopbtn.isEnabled = false
            binding.startbtn.isEnabled = false
            binding.Resetbtn.isEnabled = true


        })

    }

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



        return super.onKeyDown(keyCode, event)
    }
}

 

  • 앱 실행화면