코딩ㆍ개발 정보/안드로이드앱 (코틀린)

viewBinding 예제

RioRex 2021. 12. 21.

viewBinding이 사용 되는 예제를 살펴보자.

viewBinding을 하기 위해서는 우선 :app build.gradle 에 다음의 내용을 추가해 줘야 한다.

android {

        buildFeatures{
                viewBinding true
        }

 

기본  Activity에 viewBinding 설정하는 방법

🐤  Activity에 적용

적용 전

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

 

적용하는 방법 1

class MainActivity : AppCompatActivity() {
    
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        setContentView(R.layout.activity_main)
        setContentView(binding.root)
    }

 

적용하는 방법 2

class MainActivity : AppCompatActivity() {

    // 액티비티에서 사용할 레이아웃의 뷰 바인딩 클래스
    private lateinit var binding: ActivityMainBinding

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

        // 뷰 바인딩 클래스의 인스턴스를 생성합니다.
        binding = ActivityMainBinding.inflate(layoutInflater)

        // 생성된 뷰를 액티비티에 표시합니다.
        setContentView(binding.root)
    }

-- 출처: https://www.androidhuman.com/2020-11-25-android_view_binding

 

Fragment에 설정하는 방법

🐤 Fragment 적용
기본

class BlankFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false)
    }​


적용하는 방법 1

class BlankFragment : Fragment() {
    //lateinit 으로 binding을 선언
    lateinit var binding: FragmentBlankBinding
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
//        return inflater.inflate(R.layout.fragment_blank, container, false)
        binding = FragmentBlankBinding.inflate(inflater, container, false)
        return binding.root
    }

적용하는 방법 2

class BlankFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
//        return inflater.inflate(R.layout.fragment_blank, container, false)
        val binding = FragmentBlankBinding.inflate(inflater, container, false)
        return binding.root
    }

적용하는 방법 3
class SecondFragment : Fragment() {

    private var _binding: FragmentSecondBinding? = null;

    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentSecondBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}​

-- 출처: https://www.androidhuman.com/2020-11-25-android_view_binding

Adapter에 설정하는 방법

🐤 Adapter에 적용



적용하는 방법 1
class CustomAdapter : RecyclerView.Adapter<Holder>() {
    // 바인딩.inflate() 구조는 프래그먼트와 동일
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }
    ... 생략
}
// val 예약어로 바인딩을 전달 받아서 전역으로 사용합니다.
// 그리고 상속받는 ViewHolder 생성자에는 꼭 binding.root를 전달해야 합니다.
class Holder(val binding: ItemRecyclerBinding) : RecyclerView.ViewHolder(binding.root) {
    fun setValue(value:String) {
        // 생성자에서 val로 받았기 때문에 홀더 내부 어디에서나 binding 사용가능
        binding.textView.text = value
    }
}​
- 출처: https://flow9.net/bbs/board.php?bo_table=android&wr_id=27

적용하는 방법 2
class CustomPagerAdapter : RecyclerView.Adapter<Holder>() {
    var textList = listOf<String>()

    override fun getItemCount(): Int {
        return textList.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemViewpagerBinding.inflate(LayoutInflater.from(parent.context), parent,false)
        return Holder(binding)
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        val text = textList[position]
        holder.setText(text)
    }
}

//홀더에서 binding 파라미터를 전역변수로 사용하기 위해서 앞에 val 키워드를 사용하는 것을 꼭 기억하자
class Holder(val binding: ItemViewpagerBinding): RecyclerView.ViewHolder(binding.root){
    fun setText(text:String){
        binding.textView.text = text
    }
}​

출처: 이것이 안드로이드다, 코틀린편, 개정판 P.429

 

 

반응형

댓글