findViewById() 메서드를 사용하지 않아도 레이아웃 파일을 기반으로하는 액티비티나 프래그먼트를 클래스 안 뷰에 참조 변수를 직접 할당할 수 있다. 뷰 바인딩은 안드로이드 데이터 바인딩과는 다른 기술이므로 혼동하지 않도록 주의!
뷰 바인딩을 사용해 버튼을 누르면 토스트 메세지가 나오게 만들기.
(MainActivity, Fragment 에서 바인딩 방법이 다르기 때문에 두 가지로 해보겠습니다.)
Activity에 맞는 레이아웃에서 설정.
<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">
// id 설정을 해줘야 바인딩 가능
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/IdButton"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="클릭 시, 토스트 메세지"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Gradle Scripts > build.gradle(Module: 프로젝트명)
android {
// ..
buildFeatures {
viewBinding true
}
}
위 코드를 작성 후 Sync Now 라는 메시지를 클릭해 그래들 수정을 확정.
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.a230727_viewbinding.databinding.ActivityMainBinding
private lateinit var binding: ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//(1) 바인딩 생성
val binding = ActivityMainBinding.inflate(layoutInflater);
//(2) 최상위 레이아웃 표시
setContentView(binding.root)
//뷰 바인딩으로 버튼 접근
binding.IdButton.setOnClickListener() {
toast("버튼이 클릭 되었습니다.")
}
}
fun toast(message: String){
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
(1) 바인딩 초기화 : val binding = ActivityMainBinding.inflate(layoutInflater)
레이아웃 파일명의 첫글자와 언더바( _ ) 다음 글자를 대문자로 바꾸고 (activity_login -> ActivityLogin),
뒤에 Binding을 붙여 바인딩 생성하고, inflate 메서드는 인자로 전달된 레이아웃 파일을 기반으로 layoutInflater을 활용해 뷰 계층 구조를 만든다.
(2) 레이아웃에 표시 : setContentView(binding.root)
최상위 뷰로 레이아웃을 설정한다.
프래그먼트 바인딩도 조만간 정리하겠습니다~!!