카테고리 없음
고민했던 이모저모
찐빵개발자
2021. 12. 15. 16:25
[서버에서 api 응답값 받을때]
@JsonIgnoreProperties(ignoreUnknown = true)
data class ApiResult(@SerializedName("field") val field: String)
일반적으로 서버에서 null 필드가 있으면 제외하고 보내줄텐데..
data class ApiResult(@SerializedName("field") val field: String = "")
근데 null을 정말로 내려준다면?_?
nullable 하지 않은 곳에 null이 들어가서 fail...
data class ApiResult(@SerializedName("field") val field: String?)
nullable 변수로 만들기는 싫고..
구래서 이렇게 했다
data class ApiResult(@SerializedName("field") private val _field: String?) {
val field: String
get() = _field ?: ""
}
[ViewModel에서 LiveData 쓸때]
val liveData: MutableLiveData<String> = MutableLiveData()
타입과 생성자 모두 mutable로 쓰는사람?
이렇게 하면 외부에서 수정 가능함
캡슐화를 해볼까?
private val _liveData: MutableLiveData<String> = MutableLiveData()
val liveData: LiveData<String> = _liveData
매번 모든 변수를 두개씩이나 만들어야해..? 라는 불만이 생겼다
시니어님께서 해결해주셨다 (thx. 시니어님)
interface LiveDataSettable {
fun <T : Any?> LiveData<T>.setValue(value: T) {
if (value == null)
throw IllegalArgumentException("value must be not null!")
(this as MutableLiveData<T>).value = value
}
fun <T : Any?> LiveData<T>.postValue(value: T) {
if (value == null)
throw IllegalArgumentException("value must be not null!")
(this as MutableLiveData<T>).postValue(value)
}
}
val liveData: LiveData<String> = MutableLiveData<String>().apply { value = StringUtils.EMPTY }
[ConstraintLayout에서 텍스트뷰 여러개가 있을때 말줄임을 원하는곳만 하고싶을때]
첫번째텍스트, 두번째텍스트, 세번째 텍스트가 있다
위와같이 두번째 텍스트에만 말줄임을 주고싶다면 어떻게 xml을 구성하겠는가?
기본 구성은 아래와 같이 처리하겠지?
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/startGuide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/endGuide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="100dp" />
<TextView
android:id="@+id/firstText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="첫번째텍스트"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/startGuide"
app:layout_constraintRight_toLeftOf="@id/secondText"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/secondText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="두번째텍스트"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/firstText"
app:layout_constraintRight_toLeftOf="@id/thirdText"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/thirdText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="세번째텍스트"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/secondText"
app:layout_constraintRight_toRightOf="@id/endGuide"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
이렇게 처리하였다
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/startGuide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/endGuide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="100dp" />
<TextView
android:id="@+id/firstText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="첫번째텍스트"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintLeft_toRightOf="@id/startGuide"
app:layout_constraintRight_toLeftOf="@id/secondText"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/secondText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:text="두번째텍스트"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/firstText"
app:layout_constraintRight_toLeftOf="@id/thirdText"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/thirdText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="세번째텍스트"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/secondText"
app:layout_constraintRight_toRightOf="@id/endGuide"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
ConstraintLayout 에서 0dp == match_constraint (제약 조건 내에 가능한 영역을 모두 채운다)