개발/Android
ViewBinding
Lumasca
2021. 2. 25. 10:26
app모듈 build.gradle 파일에 viewBinding 사용 설정을 한다.
android {
buildFeatures{
viewBinding = true
}
}
Binding 클래스이름은 레이아웃 xml 파일명을 파스칼케이스(단어 첫글자를 대문자표기)로 변환하여 Binding을 붙인다.
예)
activity_main.xml => ActivityMainBinding
fragment_menu.xml => FragmentMenuBinding
contact_list_item.xml => ContactListItemBinding
Activity
//바인딩 변수 생성할때 초기화
val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//기존
//setContentView(R.layout.activity_main)
//변경 binding.root로 전달
setContentView(binding.root)
}
fun initView(){
binding.txtName.text = "Name" //사용은 기존코드에 binding. 만 앞에 추가하면 된다.
}
Fragment
//바인딩 변수
private lateinit var binding:FragmentMenuBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
//기존
//val view = inflater.inflate(R.layout.fragment_menu, container, false)
//return view
//변경
binding = FragmentMenuBinding.inflate(inflater, container, false)
return binding.root
}
fun initEvent(){
binding.btnUp.setOnclickListener{v:View? -> //TODO }
}
Adapter
class ContactListAdapter(val contacts: ArrayList<Contact>) : RecyclerView.Adapter<ContactListAdapter.ViewHolder>() {
//기존
//class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
//변경 binding.root로 전달
class ViewHolder(val binding: ContactListItemBinding) : RecyclerView.ViewHolder(binding.root){
fun bindItems(contact:Contact){
//기존
//val tvName = itemView.findViewById(R.id.tvName) as TextView
//val tvNumber = itemView.findViewById(R.id.tvNumber) as TextView
//변경 binding 추가
binding.tvName.text = "("+ contact.id +") "+ contact.name
binding.tvNumber.text = contact.number
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactListAdapter.ViewHolder {
//기존
//val v = LayoutInflater.from(parent.context).inflate(R.layout.contact_list_item, parent, false)
//return ViewHolder(v)
//변경
val binding = ContactListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bindItems(contacts[position])
}
override fun getItemCount(): Int {
return contacts.size
}
}