생 초보가 Android App 개발하는 일기 with kotlin - 3
이번에는 5~6 Activiy랑 Event처리에 대해서 공부했습니다.
Activity
Activity는 app의 page개념으로 여러 activity가 있을 수 있으면 그중 Main Activity는 필수입니다.
보통 android의 Activiry class를 상속받아서 재정의하고 중요 함수를 overide해서 사용하게 됩니다.
위 그림이 Activity의 liftcyle인데 각 함수가 어떻게 동작하는지 정의하고 있습니다.
5강에선 각 함수별로 log를 찍어서 app상태가 어떻게 전이되는지 실습해봤습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("Lifecycle", "onCreate()")
}
override fun onStart() {
super.onStart()
Log.i("Lifecycle", "onStart()")
}
override fun onResume() {
super.onResume()
Log.i("Lifecycle", "onResume()")
}
override fun onPause() {
super.onPause()
Log.i("Lifecycle", "onPause()")
}
override fun onStop() {
super.onStop()
Log.i("Lifecycle", "onStop()")
}
override fun onRestart() {
super.onRestart()
Log.i("Lifecycle", "onRestart()")
}
override fun onDestroy() {
super.onDestroy()
Log.i("Lifecycle", "onDestroy()")
}
}
그리고 남은 시간에는 UI편집기로 layout UI 그리는 방법을 알려주네요.
Event
6장은 대망의 Event처리에 대한 강의입니다.
그런데 예제따라하다가 Activity에서 Layout객체에 접근하려니 에러가 나네요.
kotlinx.android.synthetic.main.activity_main가 없다는데 autoimport가 동작하지 않는 것 같습니다.
수동으로 입력해도 에러가 나길래 찾아보니 gradle설정에 아래 kotlin-extension을 추가하고 sync해주면 동작한다고 하네요.
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
Android에서 Event를 처리하는 방법에는 총 4가지 방법이 있습니다.
아래에 하나씩 정리해보았습니다.
-
layout의 객체에 OnClick attribute에 사용자 정의한 function추가
-
activity에 사용자 정의 함수 생성
fun onButton(v: View) { textView.text = "눌렸습니다." textView.textSize = 50.toFloat() Toast.makeText( this, "눌렸습니다", Toast.LENGTH_SHORT).show() }
-
layout에 OnClick Event에 함수 등록
-
-
EventListerner 등록
-
Activity Class에 Event Listner interface 추가하고 함수를 구현 후 onCreate()에서 button객체에 listner등록
class MainActivity : AppCompatActivity(), View.OnClickListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener(this) } override fun onClick(p0: View?) { //TODO("Not yet implemented") textView.text = "또 눌렸습니다" textView.textSize = 50.toFloat() }
-
Event Handler 등록
-
View.OnClickListener를 상속받는 inner class로 event hendler구현. 이것도 onCreate에서 button객체에 등록 필요.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val h: MyHandler = MyHandler() button.setOnClickListener(h) } inner class MyHandler : View.OnClickListener { override fun onClick(p0: View?) { textView.text = "또 다시 눌렸습니다" textView.textSize = 50.toFloat() } }
-
-
Lambda 구현
-
가장 깔끔한 구현 방법으로 이걸 추천.
-
onCreate() 함수에서 바로 lambda로 구현
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { textView.text = "눌렀습니다2" textView.textSize = 50.toFloat() } }
-
추가로 image파일을 받아서 background로 넣어주는 것도 설명해줍니다.
image를 app\src\main\res\drawable 경로에 넣어주고 activity_main.xml에서 background 속성을 추가해주면 됩니다.
주의할 점은 파일명에 띄어쓰기나 대시(-)가 있으면 안 된다고 합니다.
<?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"
android:background="@drawable/background"
>
이제 뭔가 눌리면 동작하는 녀석을 만들었봤는데 역시 이런 게 재밌습니다.
Intent로 여러 Activity를 넘나들면서 동작하는 건 다음 강좌를 통해서 배울 수 있을 것 같네요.