ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생 초보가 Android App 개발하는 일기 with kotlin - 3
    Android 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를 넘나들면서 동작하는 건 다음 강좌를 통해서 배울 수 있을 것 같네요.

     

    댓글

Designed by black7375.