포트폴리오/[IoT 기반 피지컬 AI 교육일지]

[ 안드로이드 앱 개발 기초 ] XML 레이아웃 설계, UI 동적 제어 및 액티비티 생명주기 (33일차 기록)

개발자혜콩 2026. 4. 9. 16:35

1. 오늘 한 것

① 안드로이드 UI 레이아웃(Layout) 특성 파악 및 중첩 실습

  • ConstraintLayout: 뷰(View) 간의 상대적인 제약 조건(Top, Bottom, Start, End)을 연결하여 화면을 구성하는 기본 레이아웃 사용법 숙지.
  • LinearLayout: 화면을 가로(horizontal) 또는 세로(vertical)로 순차 배치. weightSum과 layout_weight 속성을 사용해 화면을 4:4:2 비율로 정밀하게 분할하는 실습 진행.
  • FrameLayout: 여러 뷰를 겹쳐서(Stacking) 배치. 카카오톡 알림 배지처럼 이미지(ImageView) 위에 숫자 텍스트(TextView)를 우측 상단에 겹쳐 띄우는 중첩 UI 구현.

② XML 디자인과 Java 로직의 연결 및 동적 제어

  • 객체 바인딩: XML에서 부여한 ID를 Java 파일에서 findViewById() 메서드를 통해 객체로 연결.
  • 텍스트 토글 기능: 버튼 객체에 setOnClickListener를 달고, getText().toString().equals()를 활용해 클릭 시 "Hello World!"와 "Good Bye~"가 번갈아 가며 출력되도록 구현.
  • 이미지 동적 교체: ImageView의 scaleType="centerCrop"(비율 유지 꽉 채움) 속성을 확인하고, Java 로직에서 imageView.setImageResource(R.drawable.momoland)를 호출해 버튼 클릭 시 화면의 이미지가 동적으로 바뀌도록 구현.

③ 안드로이드 화면 생명주기(LifeCycle) 및 인텐트(Intent) 실습

  • 생명주기 로그 추적: 앱이 켜지고 꺼지는 과정에서 호출되는 콜백 메서드(onCreate, onStart, onResume, onPause, onStop, onRestart)들을 오버라이딩함. 내부마다 Log.i()를 심어, 홈 버튼 클릭이나 화면 복귀 시 로그캣(Logcat)에 생명주기가 어떤 순서로 찍히는지 실시간 확인.
  • 명시적 인텐트: Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")) 객체를 생성하여, 내 앱 내부 화면 전환이 아닌 외부 앱(구글 브라우저)을 호출해 띄우는 기능 구현.

2026.04.09 - [[Android] 안드로이드] - [ 안드로이드 기본 ] xml 레이아웃 연습하기 3단계

 

[ 안드로이드 기본 ] xml 레이아웃 연습하기 3단계

1.BasicApp01 를 활용해 다음과 같은 화면 만들어보기 ▼actuvity_main.xml 코드 2. BasicApp02 2개를 활용해 다음과 같은 화면 만들어보기 ▼actuvity_main.xml 코드 3. BasicApp03주요 구현 조건구조 (Vertical)전체 화

hyekkong.tistory.com

 

2026.04.09 - [[Android] 안드로이드] - [ 안드로이드 기본 ] 버튼 setOnClickListener() 활용, 이미지뷰 동적 변경, 액티비티 생명주기(LifeCycle)

 

 

[ 안드로이드 기본 ] 버튼 setOnClickListener() 활용, 이미지뷰 동적 변경, 액티비티 생명주기(LifeCycle)

1. ButtonTest1 를 활용해 다음과 같은 화면 만들어보기▼결과화면▼actuvity_main.xml 코드 ▼MainActivity.java 코드package 본인것;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget

hyekkong.tistory.com


2. 문제 / 헷갈린 점

① 레이아웃 속성 및 단위의 헷갈림

  • gravity vs layout_gravity: 텍스트나 이미지를 가운데 정렬하려 할 때 혼동됨.
    • gravity: 뷰 내부의 내용물(텍스트 등)을 정렬할 때 사용.
    • layout_gravity: 뷰 자체를 부모 레이아웃 안에서 정렬할 때 사용. (FrameLayout 실습 시 알림 배지 숫자를 right|top으로 보낼 때 차이를 체감함)
  • dp vs sp: 마진이나 뷰의 크기는 dp(Density-independent Pixels)를 쓰는 것이 맞지만, 폰트 크기는 사용자의 스마트폰 시스템 글꼴 설정에 맞춰 자동 조절되는 **sp(Scale-independent Pixels)**를 사용하는 것이 안드로이드 표준 권장 사항임을 구분하여 암기함.

② Java 익명 클래스와 람다식(Lambda) 문법의 낯설음

  • 상황: 버튼 이벤트를 줄 때 new View.OnClickListener() {...} 형태의 괄호 구조가 복잡해 한눈에 안 들어왔고, 이후 생명주기 예제에서 view -> { ... } 형태의 화살표 문법이 갑자기 등장해 당황함.
  • 해결: 안드로이드 콜백 처리의 기본 패턴임을 인지함. 화살표 문법은 Java 8부터 지원하는 '람다식'으로, 길었던 익명 클래스 구조를 극단적으로 축약한 것일 뿐 내부적인 동작 원리는 동일하다는 것을 이해함.

③ 안드로이드 고유 시스템: R 클래스와 생명주기의 디테일

  • R 클래스: R.id..., R.drawable...처럼 항상 R을 통과해야 하는 이유를 학습함. OS가 개발자가 추가한 모든 자원(레이아웃, 이미지 등)에 고유 정수 ID를 부여하고 목차처럼 자동 관리해 주는 시스템 클래스임을 파악함.
  • onPause() vs onStop(): 홈 버튼을 누르면 두 메서드가 연달아 호출되어 역할 구분이 어려웠음.
    • onPause(): 반투명 팝업 등으로 화면 일부가 가려지거나 포커스만 잃었을 때 호출됨 (데이터 저장이나 카메라 자원 등 해제 시작).
    • onStop(): 다른 앱이 띄워져 화면이 100% 완전히 가려졌을 때 호출됨을 구분함.

3. 오늘 배운 핵심

① 안드로이드 앱은 XML과 Java의 철저한 분업이다:

  • 자원은 res 폴더에 두고 XML로 화면을 디자인한 뒤, findViewById와 R 클래스를 통해 Java 객체와 결합하여 기능을 제어한다.

② 뷰 중첩은 FrameLayout, 비율 분할은 LinearLayout의 weight 속성이 정답이다. 

 

③ 앱은 내 마음대로 종료되지 않는다:

  • 윈도우 프로그램과 달리 스마트폰 앱은 자원 부족 시 OS가 강제로 죽이거나 살릴 수 있으므로, 생명주기(LifeCycle) 흐름에 맞춘 데이터 저장/복원 로직 설계가 앱의 안정성을 좌우한다.

4. 다음 목표

  • XML에서 입력 상자(EditText)를 추가해 사용자의 입력을 받아 Java에서 처리해 보는 기능 구현.
  • 명시적/암시적 인텐트를 심도 있게 학습하여, 내 앱 안에서 여러 개의 화면(Activity)을 만들고 데이터를 주고받으며 화면 전환해 보기.
  • ListView나 RecyclerView를 활용하여 반복되는 항목(연락처 목록, 채팅방 등)을 스크롤 형태로 화면에 뿌려주는 실습 진행.