DataBindingAdapter를 활용하여 XML 에서 값에 따른 Margin을 적용하는 방법을 잃어버리지 않기 위해 기록합니다.
1. BindingAdapter
@BindingAdapter("layoutMarginTop")
fun setLayoutMarginTop(view: View, dimen: Float) {
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = dimen.toInt()
}
}
-> dimen으로 전달 받은 값을 TopMargin에 적용 후, View Update
2. XML
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<import type="android.view.View"/>
<variable
name="vm"
type="com.activity.LoginViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
...........
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_authority"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginHorizontal="56dp"
app:layoutMarginTop="@{vm.loginButtonMarginEvent ? @dimen/auto_login : @dimen/not_auto_login}"
android:drawablePadding="18dp"
android:gravity="center"
android:insetTop="0dp"
android:insetBottom="0dp"
android:text="@string/login_btn"
android:textAllCaps="true"
app:backgroundTint="@color/active_button_color"
app:icon="@drawable/ic_ok_n"
app:iconGravity="textStart"
app:iconPadding="10dp"
app:iconTint="#fff"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/checkBoxLogin"
android:onClick="@{()->vm.onLogin()}"/>
.............
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
-> app:layoutMarginTop 에서 ViewModel의 Boolean 값으로 삼항연산자 사용하여 TopMargin 값을 조정합니다.
3. dimen
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="not_auto_login">16dp</dimen>
<dimen name="auto_login">4dp</dimen>
</resources>
** 다른위치의 Margin 값을 적용할 때 참고하시면 됩니다. **
import android.view.View
import android.view.ViewGroup
import androidx.databinding.BindingAdapter
@BindingAdapter("android:layout_marginBottom")
fun setLayoutMarginBottom(view: View, dimen: Int) {
(view.layoutParams as ViewGroup.MarginLayoutParams).let {
it.bottomMargin = dimen
view.layoutParams = it
}
}
@BindingAdapter("android:layout_marginTop")
fun setLayoutMarginTop(view: View, dimen: Int) {
(view.layoutParams as ViewGroup.MarginLayoutParams).let {
it.topMargin = dimen
view.layoutParams = it
}
}
@BindingAdapter("android:layout_marginStart")
fun setLayoutMarginStart(view: View, dimen: Int) {
(view.layoutParams as ViewGroup.MarginLayoutParams).let {
it.marginStart = dimen
view.layoutParams = it
}
}
@BindingAdapter("android:layout_marginEnd")
fun setLayoutMarginEnd(view: View, dimen: Int) {
(view.layoutParams as ViewGroup.MarginLayoutParams).let {
it.marginEnd = dimen
view.layoutParams = it
}
}
* 참고 URL
Android databinding - How to get dimensions from dimens.xml
I want to set margins based on dimensions i have created in dimens.xml The dimensions it sself works fine, its just data binding cant find it in the case below:
stackoverflow.com
반응형