액티비티에서 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)
}
}
viewBinding
은 이러한 findViewById
의 문제를 해결할 수 있다.
viewBinding
은findViewById
와 같은 역할을 하지만 여러가지 장점이 있다.
viewBinding
을 사용하기 위해서는 먼저 모듈 단위의 build.gradle
에 아래 코드를 추가해준다.
android {
...
// android 3.6 ~ 4.0
viewBinding {
enable = true
}
// android 4.0 ~
buildFeatures {
viewBinding = true
}
}
// 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
}
<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 { ... }
Android Jetpack의 라이브러리중 하나로 xml에 데이터를 binding해서 사용할 수 있게 해준다.
android {
...
// android 3.6 ~ 4.0
dataBinding {
enable = true
}
// android 4.0 ~
buildFeatures {
dataBinding = true
}
}
<layout ... >
<data>
<variable
name="vm"
type="com.example.databinding.MainViewModel" />
</data>
<LinearLayout ... >
...
</LinearLayout>
</layout>
기존 xml에 dataBinding을 할 수 있도록 <layout>
태그로 감싸고 <data>
태그에 <variable>
을 추가하여 데이터를 연결해준다.
name : 레이아웃에서 사용할 변수의 이름
type : 사용할 변수의 타입
// 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
}
<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와 함께 사용한다.