카테고리 없음

고민했던 이모저모

찐빵개발자 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 (제약 조건 내에 가능한 영역을 모두 채운다)