티스토리 뷰

728x90

 


뷰 컨트롤

• 사용자와의 상호작용으로 인해서 뷰를 조작하는 방법

• 뷰에 이벤트가 발생했을 때 처리하는 방법

• xml에 존재하는 뷰를 kotlin으로 가져와서 처리할 수 있다.

 

1. findViewById

• xml에 존재하는 뷰를 kotlin으로 가져오는 방법.

• findViewById(R.id.아이디) : 해당 아이디의 view를 가져온다.

     - Id -> xml에서 부여한 view의 id

• 그 외에도 view를 가져오는 방법에는 kotlinx, databinding 등이 있다.

     - kotlinx : 번거로운 findViewById 과정을 생략 가능. 하지만 deprecated -> 가급적으로 사용을 피해야 한다.

     - databinding : 뷰와 데이터를 묶는 방법. 심화 내용이다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#FF0000"
        android:text="안녕하세요." />

</androidx.appcompat.widget.LinearLayoutCompat>

xml에 존재하는 text1

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView

class ViewControl_03 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_control03)

        // 뷰를 코틀린으로 가져오는 방법
        val text1: TextView = findViewById(R.id.text1) // findViewById를 통해 id가 text1인 뷰를 가져옴.
        Log.d("testt", text1.text.toString()) // 안녕하세요. 출력
    }
}

xml에 존재하는 text1 뷰의 텍스트 값을 findViewById를 이용하여 코틀린으로 가져와 출력한 모습

 

 

2. Listener

• 이벤트가 발생했을 때 수신하는 역할

• 종류가 다양하고, 각 뷰에 특화된 리스너가 많다.

     -> 다 외울 수 없고, 그때그때 찾아가면서 사용하는 것이 좋다.

     ex) 버튼을 클릭했을 때, 글자를 입력했을 때, 드래그를 했을 때 등...

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ViewControl_03">

    <Button
        android:id="@+id/button1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="버튼1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="버튼2" />

    <Button
        android:id="@+id/button3"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="버튼3" />

</androidx.appcompat.widget.LinearLayoutCompat>

xml에 존재하는 button1, button2, button3

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button

class ViewControl_03 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_control03)

        // xml의 button1, button2, button3 가져오기
        val button1: Button = findViewById(R.id.button1)
        val button2: Button = findViewById(R.id.button2)
        val button3: Button = findViewById(R.id.button3)

        // 1. 클래스 이용
        class MyClickListener : View.OnClickListener {
            override fun onClick(v: View?) {
                Log.d("testt", "버튼1 클릭!")
            }
        }
        val myClickListener: MyClickListener = MyClickListener()
        button1.setOnClickListener(myClickListener)

        // 2. 익명 클래스
        val myClickListener2 = object: View.OnClickListener {
            override fun onClick(v: View?) {
                Log.d("testt", "버튼2 클릭!")
            }
        }
        button2.setOnClickListener(myClickListener2)

        // 3. 람다
        button3.setOnClickListener {
            Log.d("testt", "버튼3 클릭!")
        }
    }
}

버튼을 클릭하면 onClickListener가 인식하여 로그를 출력한다.

 

3. setOnClickListener 코드 설명

• 1. 클래스 이용

     - setOnClickListener는 View.OnClickListener 타입을 인자로 받는다.

View.OnClickListener를 인자로 받는 setOnClickListener

     - View.OnClickListener는 onClick 메소드를 가지는 인터페이스임.

onClick 메소드를 가지는 View.OnClickListener

     - 따라서, View.OnClickListener를 상속받는 클래스를 생성하여 onClick을 override하고, 객체를 생성하여 setOnClickListener에 넣으면 작동함.

 

 

• 2. 익명 클래스

     - View.OnClickListener 타입의 익명 객체를 만들어 setOnClickListener에 넣어주면 작동한다.

// 2. 익명 클래스
val myClickListener2 = object: View.OnClickListener {
    override fun onClick(v: View?) {
        Log.d("testt", "버튼2 클릭!")
    }
}
button2.setOnClickListener(myClickListener2)

 

 

• 3. 람다

     - 코틀린의 SAM, 람다 문법 등을 이용하여 크게 생략할 수 있다.

button3.setOnClickListener {
    Log.d("testt", "버튼3 클릭!")
}

     - 2번 익명 객체가 3번 람다식으로 생략되는 과정이 너무 자세하게 설명이 잘 되어 있는 글을 발견했습니다. 제가 참고한 글 링크 첨부합니다. https://toonraon.tistory.com/37

 

안드로이드 코틀린 람다 정리 (SAM)

자바8 이전의 옛날 문법이 익숙하다보니 코틀린은 물론이고 최근의 자바 문법들도 익숙하지 않습니다. 그 중에서 특히 적응 안 되는 게 람다라서 정리해보기로 했다. 배우는 중이라 틀린 게 있

toonraon.tistory.com

 

 

 

 

 

 

 

 

이 글은

패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.

 


728x90
댓글
공지사항