개발/자세히 쳐다 보면...

토이프로젝트 1-8 view binding

lonewhitedot 2023. 4. 12. 17:08
반응형

이건 뭐 어려울게 없어.

 

우리가 주구장창 findviewbyid로 가져와서 쓰던거를 알아서 해주는 기능이야

 

먼저 현재 코드를 보면

 

package com.lonewhite.finhelper.test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import com.lonewhite.finhelper.FinApplication
import com.lonewhite.finhelper.R
import com.lonewhite.finhelper.data.model.InvItem
import com.lonewhite.finhelper.data.repository.Repository
import java.util.Date
import javax.inject.Inject

class TestActivity : AppCompatActivity() {

    @Inject
    lateinit var repository: Repository

    override fun onCreate(savedInstanceState: Bundle?) {
        (applicationContext as FinApplication).applicationComponent.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)

        val textView = findViewById<TextView>(R.id.textView)
        val getButton = findViewById<Button>(R.id.button1)
        getButton.setOnClickListener{
            val items = repository.getAllData()
            textView.text = items.size.toString()
        }
        val setButton = findViewById<Button>(R.id.button2)
        setButton.setOnClickListener{
            val invItem = InvItem("test1", null, 55, Date(235235L), null)
            repository.insertData(invItem)
        }

    }
}

 

버튼 텍스트뷰 가져오기 넘흐 귀찮자나 그럼 이게 어떻게 간단해 지는지 알아보자.

 

사용법은 간단해

먼저 그래들 파일에 아래처럼 추가해주면 됨

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

 

그리고 그래들 싱크 한번 돌려주면 사용할 준비 끝!

 

먼저 코드 부터 보면

package com.lonewhite.finhelper.test

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.lonewhite.finhelper.FinApplication
import com.lonewhite.finhelper.data.model.InvItem
import com.lonewhite.finhelper.data.repository.Repository
import com.lonewhite.finhelper.databinding.ActivityTestBinding
import java.util.*
import javax.inject.Inject

class TestActivity : AppCompatActivity() {
    private lateinit var binding: ActivityTestBinding

    @Inject
    lateinit var repository: Repository

    override fun onCreate(savedInstanceState: Bundle?) {
        (applicationContext as FinApplication).applicationComponent.inject(this)
        super.onCreate(savedInstanceState)
        binding = ActivityTestBinding.inflate(layoutInflater)
        setContentView(binding.root)

//        val textView = findViewById<TextView>(R.id.textView)
//        val getButton = findViewById<Button>(R.id.button1)
        binding.button1.setOnClickListener{
            val items = repository.getAllData()
            binding.textView.text = items.size.toString()
        }
//        val setButton = findViewById<Button>(R.id.button2)
        binding.button2.setOnClickListener{
            val invItem = InvItem("test1", null, 55, Date(235235L), null)
            repository.insertData(invItem)
        }

    }
}

 

ActivityTestBinding 클래스는 R.layout.activity_test 이 레이아웃을 보고 알아서 만들어주는 객체야

activity_test -> ActivityTest

이런식으로 이름이 바뀌는 규칙이 있어.

 

그래들 싱크하는순가 객체가 만들어지니깐 IDE에서 대충 비슷한 이름 쓰면 나올꺼야.

 

저기에 뷰를 그리는 inflater를 넣어주고, setContentView는 binding 객체의 root 뷰를 그려랴 하고 끝인거지.

 

binding 객체는 id랑 이름이 같은 변수로 이미 findviewById를 해서 가지고 있어서 그냥 쓰기만 하면 끝!

간다하지?

 

databinding은 여기서 한단계 더 나아가서 xml에서 코드를 가져오는? 뭐 그렇게 이해하면 되기는 하는데,

뷰가 복잡해지고 그러면 너무 헷갈려서 난 못하겠더라고. 가독성도 양쪽에 나눠져 있으니깐 어렵고.

 

그래서 나는 보통 뷰 바인딩만 사용하지.

 

다음번에는... 이제 mvvm의 VM을 해보자!!!!!!!!!!!!!

반응형