안드로이드 View Binding

김명진·2021년 1월 24일
1

안드로이드

목록 보기
12/25
post-custom-banner

💡 View Binding이란?


뷰 바인딩은 Activity나 fragment와 같은 뷰와 상호 작용할때 보다 쉽게 코드를 작성할 수 있게 지원해주는 기능입니다. 간단하게 우리가 뷰와 상호 작용할때 주로 쓰는 findViewById를 쓰지 않고 뷰 컴포넌트를 접근할수 있게 도와주는 기능입니다.

참고: 자바를 사용하다 코틀린으로 넘어가면서 findViewById를 더이상 사용하지 않아도 됬지만 그 기능이 dedeprecated 되면서 더 이상 기능을 지원하지 않고 이제는 View Binding을 사용하도록 권장하고 있습니다.

💡 View Binding 설정하기


View Bindind은 Android studio 3.6 Canary 11 이상 버전부터 지원 됩니다.

우선 뷰바인딩을 사용하기 위해서는 build.gradle 파엘이 viewBinding 요소를 추가해줘야합니다.

//Android Studio 3.6 이상
android {
	viewBinding {
		enabled = true
	}
}

//Android Studio 4.0 이상 (4.0 버전부터는 buildFeatures로 이동되었다.)
android { 
	buildFeatures { 
		viewBinding = true 
	} 
}

💡 Activity에서 View Binding 사용하기


build.gradle에서 뷰 바인딩을 설정하면 안드로이드 스튜디오에서 자동으로 xml 파일과 연동되는 바인딩 클래스를 생성해줍니다. 뷰바인딩 클래스 이름은 연동되어있는 해당 Acitivty의 이름을 반전 시킨 이름으로 생성이 됩니다.

예를 들어, MainActivity 클래스에서 해당 뷰바인딩 클래스 이름은 ActivityMainBinding 입니다.

이제 한번 MainActivity에서 뷰바인딩을 설정해보도록 하겠습니다.

//기존 MainActivity 클래스
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 레이아웃과 연결
        setContentView(R.layout.activity_main)

	//기존에 뷰 컴포넌트 접근방법
	val textView: TextView = findViewById(R.id.text_view)
	textView.text = "hello world!"
      }
}

//뷰바인딩 MainActivity 클래스
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
	// 자동으로 완성된 Activity Main Binding 클래스를 인스턴스로 가져온다.
	val activityMainBinding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
				
	// 뷰바인딩과 연결
	setContentView(activityMainBinding.root)

	//뷰바인딩후 뷰 컴포넌트 접근 방법
	activityMainBinding.textView.text = "hello world!"

      }
}

뷰 바인딩을 사용하면 findViewById 없이 보다 편리하게 뷰 컴포넌트를 접근할수 있다.

💡 Fragment에서 View Binding 사용하기


이제 Fragment에서 View Binding을 사용해보도록 하겠습니다. Fragment도 Activity와 마찬가지로 자동으로 xml 파일과 연동되는 바인딩 클래스를 생성해줍니다.

HomeFramgent가 있으면 클래스에서 해당 뷰바인딩 클래스 이름은 FragmentHomeBinding 입니다.

//기존 HomeFragment 클래스
class HomeFragment : Fragment() {
    ...
    // 뷰가 생성되었을 때
    // 프레그먼트와 레이아웃을 연결시켜주는 부분이다.
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {

				// 레이아웃과 연결하는 방법
        val view = inflater.inflate(R.layout.fragment_home, container, false)
        return view
    }
}

//기존 HomeFragment 클래스
class HomeFragment : Fragment() {
    ...
    // 뷰가 생성되었을 때
    // 프레그먼트와 레이아웃을 연결시켜주는 부분이다.
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {

	// 뷰 바인딩 가져오기. 뷰바인딩 클래스는 xml과 연동이 되어있기 때문에 layout를 명시해줄필요가없다.
	val binding = FragmentHomeBinding.inflate(inflater, container, false)

	return binding.root
        
    }
}

Fragment가 메모리에서 날라갈때, 사라질때 뷰 바인딩 객체도 날려주는것이 좋다. 메모리에서 삭제하기 위해서는 다음과 같이 하면됩니다.

//기존 HomeFragment 클래스
class HomeFragment : Fragment() {
	...
    //추후에 뷰가 사라질때 (메모리에서 삭제) 뷰바인딩 객체도 같이 날리기 위해 전체 fragment에서 변수 생성
    private var fragmentHomeBinding: FragmentHomeBinding? = null
    
    // 뷰가 생성되었을 때
    // 프레그먼트와 레이아웃을 연결시켜주는 부분이다.
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
    
    	// 뷰 바인딩 가져오기. 뷰바인딩 클래스는 xml과 연동이 되어있기 때문에 layout를 명시해줄필요가없다.
        val binding = FragmentHomeBinding.inflate(inflater, container, false)
        fragmentHomeBinding = binding
        
        return fragmentHomeBinding!!.root
    }
}
profile
꿈꾸는 개발자
post-custom-banner

0개의 댓글