안드로이드/코틀린

[안드로이드 코틀린] 뷰 결합 (View Binding)

Eu4ng 2020. 11. 11. 14:45

뷰 결합(View Binding)이란

- 뷰와 상호작용하는 코드를 쉽게 작성하기 위한 방법 -

 

이벤트리스너와 같이 뷰와 관련된 코드를 작성하기 위해서는 findViewById를 사용하는 것이 가장 기본이다. 그러나 모바일 앱 특성상 뷰와 관련된 코드가 많을 수 밖에 없기 때문에 findViewById의 반복적인 작업을 제거하기 위해  그동안 'kotlin-android-extensions'라는 기본 플러그인이 사용되어왔다. 

 

import kotlinx.android.synthetic.main.activity_main.* 

 

안드로이드 코틀린 강의나 다른 게시글들에서 위와 같은 코드가 포함되어있다면 이는 'kotlin-android-extensions'라는 플러그인이 사용되고 있다는 것이며, 이 경우 View Id를 코드내에 그대로 언급이 가능하다.

 

그러나 이러한 방법은 실수나 불편함을 야기하였으며, 런타임 및 RecyclerView에서도 오류를 불러왔기에 안드로이드 스튜디오 4.1버전에서부터는 기본 플러그인에서 제거되었으며 뷰와 상호작용하기 위해서는 ViewBinding이 기본이 되었다.

 

뷰 결합 사용법

1. 모듈 사용 설정

2. 활동에서 뷰 결합 사용 준비

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        }

3. 활동에서 뷰 결합 사용 예

- ViewBinding 사용시:

package com.example.test_ftp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.test_ftp.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        binding.btnSay.setOnClickListener {
            binding.textView.text = "Hello, Kotlin!"
        }
    }
}

* 아래는 기존 강의나 게시글들에서 사용된 방법에서 어떤식으로 변화하였는지 참고용으로 작성한 것이므로 사용하지 않을 것을 권장드립니다. 'kotlin-android-extensions' 플러그인 사용시 예제의 경우 실제 작동하는지 확인은 안 해봤습니다. 

 

- findViewById 사용시: 

package com.example.test_ftp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var btnSay = findViewById<Button>(R.id.btnSay)
        var textView = findViewById<TextView>(R.id.textView)

        btnSay.setOnClickListener {
            textView.text = "Hello, Kotlin!"
        }
    }
}

 

- 'kotlin-android-extensions' 플러그인 사용시

package com.example.test_ftp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.* 

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        btnSay.setOnClickListener {
            textView.text = "Hello, Kotlin!"
        }
    }
}