본문 바로가기
Android

[ Android ] XML Databinding Margin 적용

by 중곰 2021. 7. 13.

 

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

https://stackoverflow.com/questions/34832578/android-databinding-how-to-get-dimensions-from-dimens-xml/34835249

 

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

 

반응형