728x90

구글에서 검색어 android kotlin view bindg 을 검색하면, https://developer.android.com/topic/libraries/view-binding?hl=ko 를 검색된다.

view binding은 Android Studio 3.6 Canary 11 이상에서 사용할 수 있다.

 

앱 build.gradle 추가사항

android {
        ...
        viewBinding {
            enabled = true
        }
    }

 

또는

android {
    ...
    buildFeatures {
        viewBinding true
   }

}


    

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:background="#F5F8FD"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@layout/single_item"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

view binding 을 사용하지 않았을 때는

class MainActivity : AppCompatActivity() {

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

    }

view binding 을 사용시에는 setContentView(R.layout.activity_main)  대신에 코드를 변경해야 한다.

view binding 이름을 명명하는 원칙이 있는데, activity_main.xml 에서 첫글자는 대문자로하는 카멜 표기법으로 즉, ActivityMainBinding 으로 한다. 메인 액티비티 --> 액티비티 메인 바인딩

코드는 프래그먼트에서 뷰 결합 사용시와의 일관성 유지를 위한 코드를 작성하는 것이 좋을 듯하다.

아래 샘플 코드는 https://developer.android.com/topic/libraries/view-binding?hl=ko 에 설명된 예제

private var _binding: ResultProfileBinding? = null
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

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

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

 

class MainActivity : AppCompatActivity() {
    // view binding for the activity
    private var _binding: ActivityMainBinding? = null
    private val binding get() = _binding!!

    // get reference to the adapter class
    private var languageList = ArrayList<DataItem>()
    private lateinit var expandableAdapter: ExpandableAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 메인 액티비티 --> 액티비티 메인 바인딩
        _binding = ActivityMainBinding.inflate(layoutInflater) // 자동 완성된 액티비티 메인 바인딩 클래스 인스턴스를 가져왔다.
        setContentView(binding.root) // View Bindg 과정

        // define layout manager for the Recycler view
        binding.rvList.layoutManager = LinearLayoutManager(this)
        // attach adapter to the recyclerview
        expandableAdapter = ExpandableAdapter(languageList)

        getData()

        binding.rvList.adapter = expandableAdapter
    }

 

 

위 코드에서 바인딩 방법을 다르게 하는 예제

class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    // get reference to the adapter class
    private var languageList = ArrayList<DataItem>()
    private lateinit var expandableAdapter: ExpandableAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root) // View Bindg 과정

        // define layout manager for the Recycler view
        binding.rvList.layoutManager = LinearLayoutManager(this)
        // attach adapter to the recyclerview
        expandableAdapter = ExpandableAdapter(languageList)

        getData()

        binding.rvList.adapter = expandableAdapter
    }

 

 

RecyclerView 에서 view binding 하는 사항은 https://stackoverflow.com/questions/60423596/how-to-use-viewbinding-in-a-recyclerview-adapter 의 답변을 참조하거나, https://github.com/jsk005/KotlinProjects/blob/master/expandablerv/src/main/java/com/link2me/expandablerv/ExpandableAdapter.kt 를 참조하면 도움될 것이다.

 

블로그 이미지

Link2Me

,