Android/Android

[Android Study Jam] Unit 3: Layout, Data binding

Cha_Ji 2021. 4. 9. 19:59

이번 유닛에서는 레이아웃에 대해 다룹니다. data를 더 편하게 호출하기 위한 data binding도 배웁니다.

기초적인 레이아웃은 대표적으로 LinearLayout, ConstraintLayout이 있습니다.

나를 소개하는 앱으로 실습을 진행했습니다.

LinearLayout

먼저, LinearLayout은 직역하면 선형적인 레이아웃입니다.

상하 또는 좌우로 배치를 할 수 있습니다.

ViewGroup

뷰 그룹은 자식 뷰를 포함한 뷰를 말합니다.

LinearLayout에서는 Vertical LinearLayout, Horizontal LinearLayout으로 나눌 수 있습니다.

Resource

물론 이론이 중요하지만 Android Studio 툴의 활용 역시 중요합니다.

디자인 에디터에서 손쉽게 레이아웃을 전환할 수 있습니다.

 

레이아웃을 변경하고 나에 대해 소개하는 텍스트뷰를 추가합니다.

텍스트뷰의 스타일 역시 여러 속성을 갖고 있습니다.

  • padding을 추가해 안쪽 여백 넣을 수 있습니다.
  • margin을 추가해 바깥쪽 여백을 넣을 수 있습니다.
  • font를 변경할 수 있습니다.
  • 스타일을 추출할 수 있습니다.

이 모든것은 디자인 에디터에서 Attribute 메뉴에 들어있습니다.

위 세개는 간단하게 할 수 있는데, 스타일을 추출하는건 뭘까요?

android:textSize="@dimen/text_size

android:textSize="@dimen/text_size

작성한 스타일을 추출해서 재사용할 수 있습니다.

위 예시에서는 dimens.xml이라는 파일에 텍스트 스타일을 추출합니다.

<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="text_size">20sp</dimen> <dimen name="small_padding">8dp</dimen> <dimen name="layout_margin">16dp</dimen> </resources>

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
	<dimen name="text_size">20sp</dimen> 
    <dimen name="small_padding">8dp</dimen> 
    <dimen name="layout_margin">16dp</dimen> 
</resources>

 

Component Tree

설정을 추출하는 법을 익혔습니다.

속성들을 묶어서 저장하려면 어떻게 할까요?

Component tree에서 묶어서 저장할 수 있습니다.

저는 여기서 xml파일을 자꾸 오가고, 디자인 에디터를 활용하려니 생산성이 떨어지는 느낌을 받았습니다.

shift + shift 단축키를 사용하면 파일을 검색해서 이동할 수 있습니다.

저는 vscode의 키맵을 가져와서 shift + P 단축키로 이동하고 있습니다.

EditText

심심하게 Text만 넣으면 재미가 없겠죠?

TextView의 자식으로 EditText를 추가할 수 있습니다.

  • View를 추가 → id를 입력 → string.xml에 정보를 미리 저장 → text에 @string/edit_text 를 지정
  • 잡다한 padding, margin, gravity, style 등을 지정

Activity함수를 수정해서 상호작용을 할 수 있습니다.

private fun addNickname(view: View){ val editText = findViewById<EditText>(R.id.nickname_edit) val nicknameTextView = findViewById<TextView>(R.id.nickname_text) }

private fun addNickname(view: View){
	val editText = findViewById<EditText>(R.id.nickname_edit) 
    val nicknameTextView = findViewById<TextView>(R.id.nickname_text) 
} 

// Hide the keyboard. val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

// Hide the keyboard. 
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

튀어나온 키보드를 숨길 수도 있습니다!

ConstraintLayout

리니어 레이아웃을 배웠으니 ConstraintLayout도 배워봅시다!

직역하면 제약조건이 있는 레이아웃입니다.

뷰 사이에 제약을 걸어서 A가 왼쪽으로 움직이면 B, C가 따라서 왼쪽으로 움직입니다.

Attributes 또는 Design Editor에서 연결선을 이을 수 있습니다.

이렇게 제약이 걸려있으면 가지각색으로 나오는 스마트폰 해상도에 대응하기 좋겠죠?

Chain

제약을 걸 때도 속성이 있습니다.

  • Spread : default 스타일이며 View끼리 간격을 두고, 여백과도 같은 간격을 둔다.
  • Spread Inside : View끼리만 간격을 둔다.
  • Packed : View들 끼리 뭉친다.

 

baseline을 보는 설정을 키면 텍스트의 기준선도 볼 수 있습니다.

 

이 베이스라인을 기준으로 제약을 줄 수도 있습니다.

Data binding

액티비티 함수에서 작업할 때

Button에 기능을 넣거나, EditText 기능을 넣을 때 레이아웃에서 참조했습니다.

이럴 때마다 findViewById()라는 함수를 사용했습니다.

프로젝트 규모가 커진다면 이 긴 코드로 여러번 호출하면 코드가 난잡해집니다.

이를 보완한 것이 Data Binding 기법입니다.

Data Binding은 Binding Object를 매개로 xml파일에 Data를 연결해 사용하는 것을 의미합니다.

장점으로는 코드가 간결해지고 → 가독성, 유지관리에 이점이 있습니다.

사용자가 앱과 상호작용할 때 런타임이 아닌 앱을 시작하는 동안 즉, 컴파일 타임에 실행됩니다.

먼저 build.gradle의 android{}에 코드를 추가합니다.

buildFeatures { dataBinding true }

buildFeatures { dataBinding true }

Data binding 연습

  • 첫 번째로 data class를 만든다.
data class MyName(var name: String = "", var nickname: String = "")
  • 두 번째로 data layout을 만든다.
android:text="@={myName.name}"
  • 세 번째로 data를 채운다.
binding.myName = myName
  • data를 사용할 수 있다.
binding.apply { 
	myName?.nickname = nicknameEdit.text.toString() 
    invalidateAll() 
    ... 
}

 

참고

developer.android.com/courses/study-jams

 

Android Study Jams  |  Android 개발자  |  Android Developers

Become an Android Developer. Learn how to build Android apps in Kotlin by following an online curriculum together with a study group.

developer.android.com