[Android] findViewById() 그걸 왜 써? viewBinding, dataBinding

윤석규·2023년 3월 25일
1
post-thumbnail

findViewById?

액티비티에서 xml에 있는 뷰를 수정하기 위해서는 뷰의 id와 변수를 연결해주어야 하는데 그 때 findViewById 를 사용하여 연결한다.

class MainActivity : AppCompatActivity() {
	 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val button1 = findViewById<Button>(R.id.btn1)
        val button2 = findViewById<Button>(R.id.btn2)
    }
}

findViewById의 문제점

  • 존재하지 않는 View의 id를 가져올 경우 Null Exception이 발생한다.
  • View의 타입과 findViewById의 타입이 다를 경우 Type Exception이 발생한다.
  • View가 많아지면 코드가 많아지고 더러워진다.

viewBinding은 이러한 findViewById 의 문제를 해결할 수 있다.

viewBinding 이란?

viewBindingfindViewById 와 같은 역할을 하지만 여러가지 장점이 있다.

viewBinding의 장점

  • 잘못된 view의 id를 가지고 오지 않아 null-safety 하다.
  • type을 지정해줄 필요가 없어 type-safety 하다.
  • 바인딩 클래스를 모듈에서 자동으로 생성해주기 때문에 바로 참조할 수 있다.
  • 상대적으로 속도가 빠르다

viewBinding 사용법

1. build.gralde 추가

viewBinding 을 사용하기 위해서는 먼저 모듈 단위의 build.gradle 에 아래 코드를 추가해준다.

android {
	...
    // android 3.6 ~ 4.0
	viewBinding {
		enable = true
	}
    
   // android 4.0 ~
   buildFeatures {
   		viewBinding = true
   }
}

2. Activity & Fragment에 binding 선언

// Activity
private lateinit var binding: ActivityMainBinding

	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}
// Fragement

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

3. 사용하기

<LinearLayout ... >
        <TextView android:id="@+id/tv_name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/btn_login"
            android:background="@drawable/rounded_button" />
    </LinearLayout>

위와 같은 xml이 있을 때 아래와 같이 사용할 수 있다.

binding.tvName.text = "안녕하세요"
binding.btnLogin.setOnClickListener { ... }

dataBinding 이란?

Android Jetpack의 라이브러리중 하나로 xml에 데이터를 binding해서 사용할 수 있게 해준다.

dataBinding의 장점

  • Activity에서 View로 접근할 필요없이 연결된 데이터가 변경되면 자동으로 view가 업데이트 된다.

dataBinding 사용법

1. build.gralde 추가

android {
	...
    // android 3.6 ~ 4.0
	dataBinding {
		enable = true
	}
    
   // android 4.0 ~
   buildFeatures {
   		dataBinding = true
   }
}

2. layout 파일 수정

<layout ... >
  
    <data>
        <variable
            name="vm"
            type="com.example.databinding.MainViewModel" />
    </data>
  
    <LinearLayout ... >
        ...
    </LinearLayout>
</layout>

기존 xml에 dataBinding을 할 수 있도록 <layout> 태그로 감싸고 <data> 태그에 <variable>을 추가하여 데이터를 연결해준다.

name : 레이아웃에서 사용할 변수의 이름
type : 사용할 변수의 타입

3. Activity & Fragment에 binding 선언

// Activity
private lateinit var binding: ActivityMainBinding

	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    }
}
// Fragement

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
    
    return binding.root
}

4. 사용하기

<layout ... >
  
    <data>
        <variable
            name="vm"
            type="com.example.databinding.MainViewModel" />
    </data>
  
    <LinearLayout ... >
        <TextView android:id="@+id/tv_name" 
            android:text=@{vm.text}/>
        <Button android:id="@+id/btn_login"
            android:onClick=@{vm.onClickBtn()}
            android:background="@drawable/rounded_button" />
    </LinearLayout>
</layout>

위와 같이 layout에 값을 바로 입력할 수 있다.
@{} 의 중괄호 안에 name 에 지정했던 변수명을 사용하여 type 에 있는 값을 사용할 수 있다.

데이터 바인딩은 주로 viewModel, liveData와 함께 사용한다.

profile
나만의 것으로 만들 때까지 공부합니다 ✏️

0개의 댓글