상세 컨텐츠

본문 제목

뷰 바인딩 (View Binding)

이론공부/IT 개념정리

by 뽀사장 2024. 4. 9. 15:30

본문

728x90
반응형

 

[View Binding]

안드로이드 스튜디오 Activity에서 layout의 위젯의 아이디를 찾아 올 때 findViewById를 사용했는데 View Binding을 이용하면 코드가 좀 더 간결해지고 안전성이 높아진다

 

<뷰바인딩 설정 방법>

뷰바인딩을 사용하려면 gradle에 뷰바인딩을 사용한다는 코드를 넣어줘야한다

Gradle Scripts -> build.gradle.kts(Module :app)으로 들어가서 코드를 추가해준다

android{
...
    buildFeatures{
    	viewBinding = true
    }
}

 

이렇게 코드를 넣어주면 뷰바인딩 사용이 가능하다

 

이후 Activityd에서 아래 코드를 적어주는데 inflate는 xml에 있는 뷰를 객체화 시켜준다고 생각하면 된다

setCpmtemtView(R.layout.activity_main) 에 R.layout.activity_main대신 view를 넣어준다

이때 binding.root를 따로 선언하지 않았다면 binding.root를 넣어서 setCpmtemtView(binding.root)로 작성해도 무방하다

 

package com.spartabasic.spartatest

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.spartabasic.spartatest.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {

    //추가된 부분
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        //추가된 부분
        binding = ActivityMainBinding.inflate(layoutInflater)
        

        enableEdgeToEdge()
        setContentView(binding.root) //번경된 부분
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

    }
}

 

빨간줄이뜬다면 싱크를 맞춰주면 해결된다

이때 레이아웃 파일의 이름을 기반으로 한 바인딩 클래스를 자동 생성한다

바인딩 객체의 이름은 레이아웃 파일이름에 'Binding'을 붙여서 만들어지게 되며 예를들어 레이아웃 파일 이름이 activity_main.xml일 경우 바인딩클래스 이름은 ActivityMainBinding이 되고 fragment_home.xml인 경우 FragmentHomeBinding이 된다

 

 

<실습 예시>

 

만약 layout에 textView 아이디가 myText이고 Button 아이디가 myButton이라고 가정했을때

버튼을 눌렀을 때 다른 텍스트를 띄우는 코드는 다음과 같이 쓸 수 있다

 

package com.spartabasic.spartatest

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.spartabasic.spartatest.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        

        enableEdgeToEdge()
        setContentView(binding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        binding.myButon.setOnClickListener {
            binding.myText.text = "good"
        }



    }


}

 

뷰바인딩을 쓰지 않았다면 코드는 아래와 같았을 것이다

package com.spartabasic.spartatest

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.spartabasic.spartatest.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {
    

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
       
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        
        val text = findViewById<TextView>(R.id.myText)
        val button = findViewById<Button>(R.id.myButton)
        
        button.setOnClickListener() {
           text.text = "good"       



    }


}

 

이렇게 하나하나 findViewById로 찾아서 써야한다

728x90
반응형

관련글 더보기