View를 불러올 때 findViewById
보다 더 쉽게 작성할 수 있다, 즉 View와 상호작용하는 코드를 쉽게 작성할 수 있다.
각 xml 파일에 대해 ViewBinding 클래스를 상속 받는 개별 ViewBinding 클래스를 생성한다.
ViewBinding의 인스턴스는 id를 가진 모든 View를 직접 참조할 수 있다. (View들을 property로 가짐)
이전 kotlin extensions은 각기 다른 xml파일에서 같은 id를 사용할 수 있기 때문에 ViewBinding을 사용하는 것이 좋다.(android studio 4.1부터 지원 중단)
https://developer.android.com/topic/libraries/view-binding/migration?hl=ko
@Nullable
로 표시된다.viewBinding {
enabled = true
}
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
// 생성된 ViewBinding 클래스의 이름은 xml파일의 이름을 '카멜 표기법'을 변환하여 Binding이 뒤에 추가 된다.
// ex) activity_main.xml -> ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
// Binding 클래스의 인스턴스가 이때 생성된다.
setContentView(binding.root)
// root View를 가져와서 활성 뷰로 만든다.
binding.btnMain.setOnClickListener {
Toast.makeText( applicationContext , "gogo", Toast.LENGTH_SHORT).show()
binding.tvMain.text = "gogo"
}
// ActivityMainBinding 내에 property로 들어간 View들을
//binding.id로 가져올 수 있다.
}
}
class FirstFragment : Fragment() {
private var _binding : FragmentFirstBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// return inflater.inflate(R.layout.fragment_first,container,false)
_binding = FragmentFirstBinding.inflate(inflater,container,false)
// binding 클래스의 인스턴스 생성
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnFirstFragment.setOnClickListener {
Toast.makeText( activity , "gogo", Toast.LENGTH_SHORT).show()
// fragment의 경우 context를 갖고있지 않아서
// context를 kotlin에서 activity로 가져온다. - 자바의 경우엔 getActivity()
binding.tvFirstFragment.text = "gogo"
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
// onDestroyView 이훼 fragment의 View는 끝나지만 fragment는 여전히 살아있기 때문에
// null로 만들어 줘야한다.
}
}
참고