외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 7(사용자 이벤트 처리하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 7(사용자 이벤트 처리하기)

Nova_ 2023. 1. 12. 17:12

- 키 이벤트

키 이벤트에서는 네비게이션 바의 뒤로가기 버튼과 음량버튼이 눌렸을때 함수를 호출할 수 있습니다.

 

onKeyDown : 키를 누른 순간의 이벤트

onKeyUp : 키를 떼는 순간의 이벤트

onKeyLongPress : 키를 오래 누르는 순간의 이벤트

package com.example.myapplication

import android.os.Bundle
import android.util.Log
import android.view.KeyEvent
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class kakotalk : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kakotalk)
    }

    override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_BACK -> {
                Log.d("log", "뒤로가기 버튼을 땟군요")
                true
            }
            KeyEvent.KEYCODE_VOLUME_DOWN -> {
                Log.d("log", "볼륨 다운 버튼을 땟군요")
                true
            }
            KeyEvent.KEYCODE_VOLUME_UP -> {
                Log.d("log", "볼륨 업 버튼을 땟군요")
                true
            }
            else -> super.onKeyUp(keyCode, event)
        }
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_BACK -> {
                Toast.makeText(applicationContext, "뒤로가기 버튼을 한번더 눌르세요", Toast.LENGTH_SHORT).show()
                true
            }
            KeyEvent.KEYCODE_VOLUME_DOWN -> {
                Log.d("log", "볼륨 다운 버튼을 눌렀군요")
                true
            }
            KeyEvent.KEYCODE_VOLUME_UP -> {
                Log.d("log", "볼륨 업 버튼을 눌렀군요")
                true
            }
            else -> super.onKeyDown(keyCode, event)
        }
    }
}

 

- 뷰이벤트

사용자가 하드웨어 버튼이 아닌 화면에 터치할경우 터치당한 각 뷰에서 이벤트를 별도로 제공합니다. 뷰 이벤트 처리는 이벤트 소스와 이벤트 핸들러를 리스너가 연결해줘야합니다.

  • 이벤트 소스 : 이벤트가 발생한 객체
  • 이벤트 핸들러 : 이벤트 발생시 실행할 로직이 구현된 객체
  • 리스너 : 이벤트 소스와 이벤트 핸들러를 연결해주는 함수

<버튼 클릭 이벤트 처리>

package com.example.myapplication

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplication.databinding.ActivityKakotalkBinding

class kakotalk : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityKakotalkBinding.inflate(layoutInflater)

        setContentView(binding.root)

        binding.button1.setOnClickListener(){
            Toast.makeText(applicationContext, "press button 1", Toast.LENGTH_SHORT).show()
        }
        binding.button2.setOnClickListener(){
            Toast.makeText(applicationContext, "press button 2", Toast.LENGTH_SHORT).show()
        }
    }


}
<?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=".kakotalk">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:text="Button1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Button2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

- 스톱워치 만들기

drawable>round_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:padding = "10dp">
    <solid android:color="#6666FF"></solid>
    <corners
        android:bottomLeftRadius="30dp"
        android:bottomRightRadius="30dp"
        android:topLeftRadius="30dp"
        android:topRightRadius="30dp"></corners>
</shape>

layout>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">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Chronometer
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/chronometer"
            android:gravity="center_horizontal"
            android:textSize="60dp"
            android:layout_marginTop="100dp"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="70dp">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/startButton"
                android:background="@drawable/round_botton"
                android:text="start"
                android:textStyle="bold"/>
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/stopButton"
                android:background="@drawable/round_botton"
                android:text="stop"
                android:textStyle="bold"
                android:layout_marginLeft="25dp"
                android:enabled="false"/>
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/resetButton"
                android:background="@drawable/round_botton"
                android:text="reset"
                android:textStyle="bold"
                android:layout_marginLeft="25dp"
                android:enabled="false"/>

        </LinearLayout>
    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

.

package com.example.stopwatch

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


class MainActivity : AppCompatActivity() {

    var pauseTime = 0L
    var initime = 0L
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

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

        binding.startButton.setOnClickListener(){
            binding.chronometer.base = SystemClock.elapsedRealtime() + pauseTime
            binding.chronometer.start()

            binding.startButton.isEnabled = false
            binding.stopButton.isEnabled = true
            binding.resetButton.isEnabled = true
        }

        binding.stopButton.setOnClickListener(){
            pauseTime = binding.chronometer.base - SystemClock.elapsedRealtime()
            binding.chronometer.stop()

            binding.startButton.isEnabled = true
            binding.stopButton.isEnabled = false
            binding.resetButton.isEnabled = true

        }
        binding.resetButton.setOnClickListener() {
            pauseTime = 0L
            binding.chronometer.stop()
            binding.chronometer.base = SystemClock.elapsedRealtime()

            binding.startButton.isEnabled = true
            binding.stopButton.isEnabled = false
            binding.resetButton.isEnabled = false
        }
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_BACK -> {
                if(System.currentTimeMillis() - initime > 3000){
                    Toast.makeText(applicationContext,"한번더 뒤로가기 버튼을 눌러주세요", Toast.LENGTH_SHORT)
                    initime = System.currentTimeMillis()
                    return true
                }
                else return true
            }
            else -> super.onKeyDown(keyCode, event)
        }
    }
}

실행화면

Comments