[Android] UI 기초 구현

SSUN·2023년 4월 4일

Android

목록 보기
2/4

View란?

안드로이드의 화면(UI)를 구성하는 모든 요소들을 말한다.
View만을 배치하기에는 계층이 존재하지 않는 불안정한 구조이기 때문에 View를 상속받아 View들을 담는 ViewGroup을 통해 UI를 그린다.

Layout

LinearLayout

LinearLayout은 가로 또는 세로의 단일 방향으로 모든 하위 요소를 정렬하는 ViewGroup, Layout이다

한계

LinearLayout은 레이아웃 중첩이 매우 많아질 수 있고, 중첩이 많아질 수록 퍼포먼스적인 문제가 발생할 수 있다

ConstraintLayout

LinearLayout의 한계를 극복하기 위해 만들어진 Layout
뷰의 크기와 위치를 제약을 통해 구성한다.
ConstraintLayoutmatch_parent보다 0dp를 사용하는 것을 권장한다.

제약을 거는 방법

android:layout_constraint<뷰가 제한을 걸어둘 위치>_to<제한을 걸릴 뷰의 위치>Of="ViewId"

장점

  1. 반응형 레이아웃을 작성할 수 있다
  2. View의 배치 방식이 복잡하더라도 View의 뎁스(레이아웃 중첩)를 깊게 두지 않고 동일한 뎁스에서 널리 퍼지게 할 수 있다

이외의 Layout

FrameLayout

액자형으로 겹치게 배치할 수 있는 Layout
추가된 순서대로 쌓이고 마지막에 추가된 뷰가 가장 위에 올라가게 된다

GridLayout

2차원 격자무늬로 배치할 수 있는 Layout

RelativeLayout

레이아웃 내의 자식 뷰 위젯들이 서로 간의 상대적 위치 관계에 따라 최종적으로 표시될 영역을 결정하도록 만드는 Layout
ConstraintLayoutRelativeLayoutLinearLayout의 장점을 합쳐서 만들어졌다

생명주기

생명주기란?

Activity가 생성되어 소멸하기까지의 전 과정
안드로이드는 앱을 개발하기 위한 프레임워크를 제공한다. 이 프레임워크에 코드를 삽입하면 코드를 상황에 맞게 실행시켜준다.
프레임워크가 코드를 인식해 실행시켜주는 것이 생명주기이고, 안드로이드 프레임워크는 해당 컴포넌트에 따라 콜백 함수가 존재하고 그 함수를 실행한다.
여기서 생명주기 함수(생명주기 콜백)은 Activity가 생성되고 소멸될 때까지 사용자가 특정 로직을 수행할 수 있도록 설계된 장치이다.

생명주기 콜백 함수를 잘 구현했을 때 방지할 수 있는 문제

  • 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
  • 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
  • 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
  • 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제

콜백함수란?

  1. 다른 함수의 인자로써 이용되는 함수.
  2. 어떤 이벤트에 의해 호출되어지는 함수

onCreate()

  • 시스템이 먼저 활동을 생성할 때 실행되는 것
  • 화면 Layout 정의, View 생성, Databinding 등은 이곳에 구현
  • 생명주기 통틀어서 단 한 번만 수행되는 메소드
  • 따라서 Activity 최초 실행에 해야하는 작업을 수행하기에 적합

onStart()

  • Activity가 화면에 표시되기 직전에 호출
  • 화면에 진입할 때마다 실행되어야 하는 작업을 이곳에 구현

onResume()

  • Activity가 화면에 보여지는 직후에 호출
  • 현재 Activity가 사용자에게 포커스인 되어있는 상태

onPause()

  • Activity가 화면에 보여지지 않은 직후에 호출
  • 현재 Activity가 사용자에게 포커스아웃 되어있는 상태
  • 다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의
  • 영구적인 Data는 이곳에 저장

onStop()

  • Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
  • 홈 키를 누르는 경우, 다른 액티비티로의 이동이 있는 경우가 있다
  • 이 상태에서 Activity가 호출되면, onRestart() 메소드가 호출

onDestroy()

  • Activity가 완전히 종료되었을 때 호출되는 메소드
  • 사용자: finish(), onBackPressed()(기존 액티비티의 onResume()까지 호출된 후 onDestroy() 호출)
  • 시스템: 메모리부족(프로세스 종료)
  • onStop(), onDestroy() 메소드는 메모리 부족이 발생하면 스킵될 수 있다

onRestart()

  • onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
  • onRestart()가 호출된 이후 이어서 onStart()가 호출

생명주기 출처 : https://velog.io/@its-mingyu/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Activity-Lifecycle

setContentView

Inflate

xml에 있는 Layout을 코틀린(자바) 코드에 맞게 객체를 생성해주고 코틀린 파일에서 사용할 수 있게 해주는 과정
Inflate 과정이 없으면 코틀린 파일에서 Layout, View 객체에 접근할 수 없다.

setContentView()

Activity 내부에는 자체적으로 Layoutinflate해주는 LayoutInflater라는 클래스가 존재한다.
이 함수는 인수로 레이아웃을 넘겨주면 내부적으로 LayoutInflater 클래스를 활용해 xml문서를 inflate하여 화면에 보여준다.

View 객체에 접근하기 - ViewBinding

안드로이드는 기본적으로 findViewById()라는 함수를 사용해 View 객체에 접근하였다
최근에 안드로이드 개발에서는 findViewById()는 거의 금기시 되고 있다

findViewById()가 금기시 되고 있나?

  • findViewById 함수 자체의 코스트가 높다.
    • ViewGroup이 트리구조(조금 복잡한 형태)로 되어 있기에 하단 뷰까지 탐색(DFS)해 나가기에 VIew를 가져오는 것 자체에 탐색 비용이 생각보다 높다.
  • Null과 Crash에 안정적이지 않다.
    • 내가 가져온 TextView가 알고보니 EditText였다면?
    • 태블릿에서는 TextView 3개를 정의했는데 일반 폰에서는 2개만 정의했다면?

ViewBinding 사용

build.gradle 파일

buildFeatures {
        viewBinding = true
    }

추가하기

.kt 파일

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}
	binding.{id}.{수행할 코드}
profile
부딪히며 성장하는 예비개발자

0개의 댓글