안드로이드
데이터 바인딩 표현식 실제 사용하면서 겪은 사례 모음집
강한 맷돼지
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속성에 쓰이는거 대신썻을때만 안스에 보이고 앱에는 작요을 안하는것이다.