안드로이드

데이터 바인딩 표현식 실제 사용하면서 겪은 사례 모음집

강한 맷돼지 2022. 2. 18. 03:45

-삼항연산자

문자열을 비교하고싶을때

<ImageView
    android:id="@+id/iv_home_right_ticket_tag_rest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="24dp"
    android:layout_marginTop="12dp"
    android:visibility="@{room.myStatus.equals(`REST`) ? View.VISIBLE : View.GONE }"
    app:layout_constraintStart_toStartOf="@+id/iv_home_right_ticket"
    app:layout_constraintTop_toBottomOf="@+id/tv_home_right_ticket_title"
    android:src="@drawable/ic_home_ticket_tag_rest" />

여기서 equals 함수 안쓰고 ==쓰면 이미지 뷰같은거에서는 안먹힘 그냥 다 false로 되어서 GONE처리됨

근데또 view에서는 먹힘 이상함 그니까 그냥 equals 함수쓰자

 

 

여기서 또 신박한 방법 type로 지정해서 문자열을 넣어줄수있다.

문자열 을 타입으로 받아서 쓰기!!

class HomeMyStatusMode {
    companion object{
        const val REST = "REST"
        const val DONE = "DONE"
        const val NONE = "NONE"
    }
}

이렇게 companion object 만들고

 

xml 에서는 이렇게 type 으로 가져온다

 <data>

     <import type="android.view.View" />

     <import type="com.spark.android.ui.home.mode.HomeMyStatusMode"/>

     <variable
         name="room"
         type="com.spark.android.data.remote.entity.response.Room" />

</data>

<ImageView
      android:id="@+id/iv_home_right_ticket_tag_done"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginStart="24dp"
      android:layout_marginTop="12dp"
      android:visibility="@{room.myStatus.equals(HomeMyStatusMode.DONE) ? View.VISIBLE : View.GONE }"
      app:layout_constraintStart_toStartOf="@+id/iv_home_right_ticket"
      app:layout_constraintTop_toBottomOf="@+id/tv_home_right_ticket_title"
      android:src="@drawable/ic_home_ticket_tag_done" />

다음 equals에 넣어놓은것처럼 변수처럼 사용하면 문자열이 들어간다.

 

결론 문자열을 사용할때는 equals를 사용하자

 

-xmlns

가끔 남의 코드들을 보다보면 bind 뭔가싶은 신기한게 붙어있는 경우가있다. 

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView_detail"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="@dimen/dp_2"
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
    app:spanCount="3"
    bind:itemDeco="@{@dimen/dp_2}"
    bind:background="@{house.color}"
    tools:listitem="@layout/item_character"/>

 

이건 layout 가장 겉에 우리가 지정해주는데 자동으로 해줘서 몰랐을 뿐이다

<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:bind="http://schemas.android.com/tools">

본인의 xml 을 봐도 저런 xmlns 를 덕지덕지 붙여놨을것이다.

 

이중 속성하나를 예시로 들어보자면

 

android:layout_width 속성에서 앞에 있는 android:는 xmlns:android로 지정된 정보를 참조한다.

 

뭐 이렇게 xmlns 에 주소로 표시한 정보를 참조해서 그에 맞는 행동을 하는것이다.

 

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"

 

xmlns:android 안드로이드 기본 SDK에 포함되어 있는 속성을 사용
xmlns:app 프로젝트에서 사용하는 외부 라이브러리에 포함되어 있는 속성을 사용
xmlns:tools 안드로이드 스튜디오의 디자이너 도구 등에서 화면에 보여줄 때 사용한다.
이 속성은 앱이 실행될 떄는 적용되지 않는다

기본적으로 생성했을때 이러한 주소들이 들어있고

각각의 용도는 이러하다 근데 이걸 이제 맘에 맞게 바꿔서 사용하는 사람들도 있는거 같다 남의 코드를 만났을떄 모르는거라고 무서워하지말자

 

tools 가 붙는다고  다 화면에 작용안하는것은 아니고 android속성에 쓰이는거 대신썻을때만 안스에 보이고 앱에는 작요을 안하는것이다.