Android

생 초보가 Android App 개발하는 일기 with kotlin - 3

rajent 2021. 1. 7. 16:23
728x90

이번에는 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가지 방법이 있습니다.

아래에 하나씩 정리해보았습니다.

  1. 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에 함수 등록

  2. 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()
        }
  1. 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()
        }
      }    
  2. 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를 넘나들면서 동작하는 건 다음 강좌를 통해서 배울 수 있을 것 같네요.