티스토리 뷰
학습 목표
- Android Studio의 Layout Editor 구성 요소를 이해한다.
- Design / Code / Split 모드의 차이를 구분한다.
- Palette를 활용하여 UI 요소(View)를 화면에 배치한다.
- XML 레이아웃이 시각적으로 구성되는 과정을 이해한다.
- 간단한 UI 화면을 직접 설계하고 실행한다.
1. Layout Editor 개요
https://developer.android.com/studio/intro/user-interface?hl=ko
Android 스튜디오 UI 알아보기 | Android Studio | Android Developers
Android 스튜디오 UI를 알아봅니다.
developer.android.com
Layout Editor는 XML 레이아웃 파일을 시각적으로 편집할 수 있는 도구이다.
이 편집기는 코드 기반(XML) 편집과 시각적 편집을 동시에 지원한다.
Layout Editor는 다음 목적을 가진다.
- UI 구조를 시각적으로 확인한다.
- 화면 크기와 비율 변화에 따른 배치를 확인한다.
- XML 코드와 실제 화면의 대응 관계를 학습한다.
2. Design / Code / Split 모드

Design 모드
- UI 요소를 마우스로 배치하는 시각적 편집 모드이다.
- 화면 중심의 레이아웃 설계에 적합하다.
Code 모드
- XML 코드를 직접 작성·수정하는 텍스트 편집 모드이다.
- 정밀한 속성 제어와 구조 이해에 적합하다.
Split 모드
- Design과 Code를 동시에 표시하는 모드이다.
- UI 학습 단계에서는 가장 권장되는 방식이다.
UI 설계와 XML 구조를 함께 이해하기 위해 Split 모드를 기본으로 사용한다.

- 툴바: 앱을 실행하거나 Android 도구를 시작하는 등 다양한 작업을 처리합니다.
- 탐색 메뉴: 프로젝트를 탐색하고 수정할 파일을 엽니다. 탐색 메뉴는 Project 창에 나타나는 구조를 좀 더 간략하게 표시합니다.
- 편집기 창: 코드를 작성하고 수정합니다. 현재의 파일 형식에 따라 편집기가 바뀔 수 있습니다. 예를 들어, 레이아웃 파일을 볼 때 편집기는 Layout Editor를 표시합니다.
- 도구 창 모음: IDE 창 외부에 있는 버튼을 사용하여 개별 도구 창을 펼치거나 접습니다.
- 도구 창: 프로젝트 관리, 검색, 버전 제어 같은 특정 작업에 액세스합니다. 창을 펼치고 접을 수 있습니다.
- 상태 표시줄: 프로젝트와 IDE의 상태를 표시하며 경고나 메시지도 표시합니다.
더 많은 화면 공간을 확보하도록 기본 창을 구성하려면 툴바와 도구 창을 숨기거나 이동합니다. 또한 단축키를 사용하여 대부분의 IDE 기능에 액세스할 수도 있습니다.
소스 코드, 데이터베이스, 작업, 사용자 인터페이스 요소 등에서 검색하려면 다음 중 한 가지 방법을 사용하세요.
- Shift 키를 두 번 누릅니다.
- Android 스튜디오 창의 오른쪽 상단에 있는 돋보기를 클릭합니다.
예를 들어, 이 검색 기능은 트리거 방법을 잊은 특정 IDE 작업을 찾으려는 경우 매우 유용할 수 있습니다.
3. Palette의 역할과 구성

Palette는 화면에 배치할 수 있는 UI 구성 요소(View)의 목록이다. 이 영역에서 원하는 View를 선택하여 레이아웃으로 드래그한다.
주요 분류
- Text: TextView 등 텍스트 출력 요소
- Buttons: Button 등 클릭 가능한 요소
- Widgets: 입력·선택 UI 요소
- Layouts: 레이아웃 컨테이너
Android Studio Palette 메뉴 전체 정리표
Text (텍스트 및 입력)
| 메뉴 | 실제 태그 | 입력 유형 / 특성 | 주요 사용 목적 |
| TextView | <TextView> | 출력 전용 | 제목, 안내 문구, 결과 표시 |
| plain Text | <EditText> | 일반 문자열 입력 | 자유 텍스트 입력 |
| password | <EditText> | 비밀번호 입력 (● 표시) | 로그인 비밀번호 |
| Password (Numeric) | <EditText> | 숫자 + 비밀번호 | 숫자 PIN 입력 |
| <EditText> | 이메일 형식 입력 | 이메일 주소 입력 | |
| phone | <EditText> | 전화번호 형식 입력 | 연락처 번호 입력 |
| Postal Address | <EditText> | 주소 입력 | 우편 주소 입력 |
| Multiline Text | <EditText> | 여러 줄 입력 | 메모, 게시글 작성 |
| Time | <EditText> | 시간 입력 | 시각 입력 |
| Date | <EditText> | 날짜 입력 | 날짜 선택 |
| Number | <EditText> | 숫자 입력 | 수량, 값 입력 |
| Number (Signed) | <EditText> | 부호 포함 숫자 | ± 값 입력 |
| Number (Decimal) | <EditText> | 소수점 숫자 | 실수 입력 |
| AutoCompleteTextView | <AutoCompleteTextView> | 자동 완성 입력 | 검색어 추천 |
| MultiAutoCompleteTextView | <MultiAutoCompleteTextView> | 다중 자동 완성 | 태그, 다중 항목 |
| CheckedTextView | <CheckedTextView> | 체크 상태 포함 텍스트 | 목록 선택 UI |
| TextInputLayout | <TextInputLayout> | 입력 래퍼(Wrapper) | 입력 필드 UX 개선 |
Buttons 영역 전체 구성
Buttons 메뉴는 사용자 입력 중 ‘클릭’ 또는 ‘선택’ 행위를 담당하는 View들의 집합이다.
모든 요소는 사용자의 의도를 명확하게 전달받기 위한 인터랙션 중심 UI이다.
| Button | <Button> | 기본 클릭 버튼 | 확인, 실행, 화면 전환 |
| ImageButton | <ImageButton> | 이미지 기반 버튼 | 아이콘 중심 액션 |
| ChipGroup | <ChipGroup> | Chip 컨테이너 | Chip 묶음 관리 |
| Chip | <Chip> | 선택형 버튼 | 태그, 옵션 선택 |
| CheckBox | <CheckBox> | 다중 선택 버튼 | 약관 동의, 복수 선택 |
| RadioGroup | <RadioGroup> | Radio 컨테이너 | 단일 선택 그룹 |
| RadioButton | <RadioButton> | 단일 선택 버튼 | 항목 중 하나 선택 |
| ToggleButton | <ToggleButton> | 상태 전환 버튼 | ON / OFF 상태 |
| Switch | <Switch> | 스위치 UI | 설정 값 제어 |
| FloatingActionButton | <FloatingActionButton> | 강조 버튼(FAB) | 핵심 주요 액션 |
Widgets 영역 전체 구성
Widgets 메뉴는 입력·출력·상태 표시 등 ‘기능성 UI’ 요소들의 집합이다. Text나 Buttons와 달리, 데이터 표현과 시스템 기능 연동에 초점이 맞추어져 있다.
| View | <View> | 기본 View | 커스텀 UI, 구분용 |
| ImageView | <ImageView> | 이미지 표시 | 사진, 아이콘 출력 |
| WebView | <WebView> | 웹 콘텐츠 | 웹 페이지 표시 |
| VideoView | <VideoView> | 동영상 재생 | 로컬·스트리밍 영상 |
| CalendarView | <CalendarView> | 날짜 선택 | 일정, 날짜 입력 |
| TextClock | <TextClock> | 시간 표시 | 현재 시간 출력 |
| ProgressBar | <ProgressBar> | 진행 상태 | 로딩, 처리 중 표시 |
| ProgressBar (Horizontal) | <ProgressBar> | 진행 상태 | 진행률 표시 |
| SeekBar | <SeekBar> | 값 조절 | 볼륨, 밝기 조절 |
| SeekBar (Discrete) | <SeekBar> | 단계 조절 | 단계형 값 선택 |
| RatingBar | <RatingBar> | 평점 입력 | 별점 평가 |
| SearchView | <SearchView> | 검색 UI | 검색 입력 |
| TextureView | <TextureView> | 그래픽 출력 | 영상·카메라 출력 |
| SurfaceView | <SurfaceView> | 고성능 렌더링 | 영상, 게임 |
| Horizontal Divider | <View> | 구분선 | UI 영역 분리 |
| Vertical Divider | <View> | 구분선 | UI 영역 분리 |
Layouts 영역 전체 구성
Layouts 메뉴는 화면의 구조(뼈대)를 정의하는 ViewGroup들의 집합이다. 모든 UI 요소(View)는 반드시 하나의 레이아웃 안에 포함되어야 한다.
| ConstraintLayout | <ConstraintLayout> | 제약 기반 레이아웃 | View 간의 관계(제약)로 위치를 결정한다 | 복잡한 화면 구성, 표준 레이아웃 |
| LinearLayout (Horizontal) | <LinearLayout> | 선형 레이아웃 | 가로 방향으로 View를 순차 배치한다 | 버튼 바, 가로 정렬 UI |
| LinearLayout (Vertical) | <LinearLayout> | 선형 레이아웃 | 세로 방향으로 View를 순차 배치한다 | 폼, 목록형 UI |
| FrameLayout | <FrameLayout> | 중첩 레이아웃 | View를 겹쳐서 배치한다 | 단일 화면, 오버레이 UI |
| TableLayout | <TableLayout> | 테이블 레이아웃 | 행(Row)과 열(Column) 구조 | 정렬된 데이터 표현 |
| TableRow | <TableRow> | 테이블 행 | TableLayout의 한 행을 구성 | 테이블 행 구성 |
| Space | <Space> | 빈 공간 View | 화면 여백을 명시적으로 확보 | 간격 조정, 레이아웃 보조 |
Containers 영역 전체 구성
Containers 메뉴는 여러 View를 담거나, 화면 구조·흐름·전환을 관리하는 상위 컨테이너의 집합이다.
Layouts가 “배치 구조”라면, Containers는 화면 동작과 흐름을 담당한다.
| Spinner | <Spinner> | 선택 컨테이너 | 드롭다운 형태의 선택 UI | 항목 중 하나 선택 |
| RecyclerView | <RecyclerView> | 목록 컨테이너 | 대량 데이터 목록을 효율적으로 표시 | 리스트, 카드 UI |
| ScrollView | <ScrollView> | 스크롤 컨테이너 | 세로 스크롤 제공 | 긴 화면 콘텐츠 |
| HorizontalScrollView | <HorizontalScrollView> | 스크롤 컨테이너 | 가로 스크롤 제공 | 가로 콘텐츠 |
| NestedScrollView | <NestedScrollView> | 스크롤 컨테이너 | 중첩 스크롤 지원 | 복합 스크롤 화면 |
| ViewPager2 | <ViewPager2> | 페이지 컨테이너 | 좌우 페이지 전환 | 슬라이드 화면 |
| CardView | <CardView> | 카드 컨테이너 | 그림자·모서리 UI | 카드형 콘텐츠 |
| AppBarLayout | <AppBarLayout> | 상단 컨테이너 | 앱 상단 영역 관리 | 상단 바 구성 |
| BottomAppBar | <BottomAppBar> | 하단 컨테이너 | 하단 앱바 제공 | 하단 네비게이션 |
| NavigationView | <NavigationView> | 네비게이션 컨테이너 | 사이드 메뉴 구성 | 네비게이션 드로어 |
| BottomNavigationView | <BottomNavigationView> | 네비게이션 컨테이너 | 하단 탭 메뉴 | 주요 화면 전환 |
| Toolbar | <Toolbar> | 액션 컨테이너 | 앱 상단 도구 모음 | 타이틀·액션 |
| MaterialToolbar | <MaterialToolbar> | 액션 컨테이너 | Material Design 툴바 | 최신 UI 가이드 |
| TabLayout | <TabLayout> | 탭 컨테이너 | 탭 기반 화면 전환 | 상단 탭 UI |
| TabItem | <TabItem> | 탭 요소 | TabLayout의 항목 | 탭 구성 요소 |
| ViewStub | <ViewStub> | 지연 로딩 컨테이너 | 필요 시 View 로드 | 성능 최적화 |
| ViewAnimator | <ViewAnimator> | 전환 컨테이너 | View 간 애니메이션 전환 | 화면 효과 |
| ViewSwitcher | <ViewSwitcher> | 전환 컨테이너 | 두 View 전환 | 간단한 상태 전환 |
| include | <include> | 레이아웃 포함 | XML 레이아웃 재사용 | 공통 UI |
| FragmentContainerView | <FragmentContainerView> | 프래그먼트 컨테이너 | Fragment 표시 | 화면 분할 |
| NavHostFragment | <fragment> | 네비게이션 컨테이너 | Navigation 컴포넌트 호스트 | 화면 흐름 관리 |
| <view> | 커스텀 컨테이너 | 사용자 정의 View | 커스텀 UI | |
| requestFocus | <requestFocus> | 포커스 제어 | 초기 포커스 지정 | 입력 UX |
| <merge> | 레이아웃 병합 | 중첩 제거 | 성능 개선 |
Helpers 영역 전체 구성
Helpers는 화면에 직접 콘텐츠를 표시하지 않는 보조 컴포넌트이다.
ConstraintLayout 환경에서 정렬, 그룹화, 기준 설정, 시각 효과를 담당한다.
| Group | <Group> | 그룹 헬퍼 | 여러 View를 하나의 그룹으로 묶어 제어 | 일괄 표시/숨김 |
| Barrier (Horizontal) | <Barrier> | 제약 헬퍼 | 여러 View 중 가장 바깥 경계를 기준으로 제약 | 동적 크기 대응 |
| Barrier (Vertical) | <Barrier> | 제약 헬퍼 | 좌·우 방향 기준 경계 생성 | 반응형 배치 |
| Flow | <Flow> | 배치 헬퍼 | 여러 View를 흐름 형태로 자동 배치 | 태그, 버튼 묶음 |
| Guideline (Horizontal) | <Guideline> | 기준선 헬퍼 | 가로 기준선 제공 | 정렬 기준 |
| Guideline (Vertical) | <Guideline> | 기준선 헬퍼 | 세로 기준선 제공 | 비율·정렬 |
| Layer | <Layer> | 레이어 헬퍼 | 여러 View를 하나의 레이어로 제어 | 애니메이션, 변형 |
| ImageFilterView | <ImageFilterView> | 이미지 헬퍼 | 이미지 필터·변형 | 시각 효과 |
| ImageFilterButton | <ImageFilterButton> | 이미지 헬퍼 | 필터 적용 버튼 | 인터랙티브 이미지 |
| MockView | <MockView> | 디자인 헬퍼 | 임시 UI 표시 | 레이아웃 설계 |
Google 영역 전체 구성
Google 메뉴는 안드로이드 기본 UI가 아닌, Google 서비스 연동을 전제로 하는 컴포넌트들의 집합이다. 이 항목들은 외부 API, 라이브러리, 계정 설정이 필요하며, 기본 UI 학습 단계에서는 개념 이해 중심으로 다루는 것이 적절하다.
| AdView | <AdView> | 광고 컴포넌트 | Google 광고 표시 | 앱 수익화 |
| MapView | <MapView> | 지도 컴포넌트 | Google 지도 표시 | 위치 기반 서비스 |
Legacy 영역 전체 구성
Legacy 메뉴는 과거 안드로이드 UI 설계에서 사용되었으나, 현재는 더 나은 대체 기술이 존재하는 컴포넌트를 모아 둔 영역이다.
| GridLayout | <GridLayout> | 레이아웃 | 격자(Grid) 구조로 View 배치 | 제한적 사용 |
| ListView | <ListView> | 목록 컨테이너 | 리스트 형태 데이터 표시 | 비권장 |
| TabHost | <TabHost> | 탭 컨테이너 | 탭 기반 화면 전환 | 비권장 |
| RelativeLayout | <RelativeLayout> | 레이아웃 | View 간 상대 위치 배치 | 비권장 |
| GridView | <GridView> | 목록 컨테이너 | 격자형 목록 표시 | 비권장 |
<ListView>
- 과거 안드로이드에서 가장 널리 사용된 리스트 컴포넌트이다.
- 대량 데이터 처리 및 성능 최적화에 한계가 있다.
- 현재는 <RecyclerView> 사용이 표준이다.
실전 예제
“한 줄 소개 카드” 화면 만들기 앱
예제 목표
- Palette에서 TextView / Plain Text(EditText) / Button을 배치하는 실습이다.
- ConstraintLayout에서 제약(Constraint) 을 연결하여 화면을 안정적으로 구성하는 실습이다.
- Kotlin에서 findViewById와 setOnClickListener로 UI를 제어하는 실습이다.

1. 화면 구성 요구사항
화면 요소
- 상단 제목: “한 줄 소개 카드”
- 입력창: “소개 문장 입력”
- 버튼: “적용”
- 결과 출력: 입력한 문장이 아래에 표시
2. 팔레트로 배치하는 절차 (Design 모드 기준)
2.1 편집 모드 설정
- res > layout > activity_main.xml을 연다.
- 상단 탭에서 Split을 선택한다.
2.2 ConstraintLayout 확인
- 루트가 ConstraintLayout이 아니라면 루트를 ConstraintLayout으로 설정한다.
2.3 Palette에서 View 배치
Palette → Text에서 다음을 배치한다.
- TextView 2개 배치이다.
- 첫 번째 TextView: 제목용
- 두 번째 TextView: 결과 출력용
- plain Text 1개 배치이다.
- 이것은 <EditText>로 생성된다.
Palette → Buttons에서 다음을 배치한다.
- Button 1개 배치이다.
2.4 제약(Constraint) 연결 원칙
- 모든 View는 최소한 가로 2개(Start/End), 세로 방향으로는 위/아래 흐름이 연결되어야 한다.
- 연결이 누락되면 런타임에서 위치가 예측 불가가 된다.
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="한 줄 소개 카드"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/etIntro"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="소개 문장 입력"
android:inputType="text"
android:padding="12dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvTitle" />
<Button
android:id="@+id/btnApply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="적용"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etIntro" />
<TextView
android:id="@+id/tvResult"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="결과가 여기에 표시된다"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnApply" />
</androidx.constraintlayout.widget.ConstraintLayout>
XML 핵심 해설
- layout_width="0dp"는 ConstraintLayout에서 양쪽 제약(Start/End)이 있을 때 “제약에 맞추어 늘어남”을 의미한다.
- hint는 EditText에 입력 전 안내 문구를 표시한다.
- 각 View는 Top_toBottomOf로 위에서 아래로 흐름을 형성한다.
Kotlin 전체 코드 (MainActivity.kt)
package com.example.chapter02
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val etIntro = findViewById<EditText>(R.id.etIntro)
val btnApply = findViewById<Button>(R.id.btnApply)
val tvResult = findViewById<TextView>(R.id.tvResult)
btnApply.setOnClickListener {
val intro = etIntro.text.toString()
tvResult.text = intro
}
}
}
Kotlin 핵심 해설
- findViewById는 XML의 View를 코드로 가져오는 연결 방식이다.
- setOnClickListener는 버튼 클릭 이벤트를 등록한다.
- isBlank()는 공백만 있는 입력까지 비어있는 것으로 처리한다.
실전 예제
“프로필 카드” 앱 (이미지 + 한 줄 소개)
1. 구현 목표
- ImageView로 프로필 이미지를 출력한다.
- EditText로 소개 문장을 입력받는다.
- Button 클릭 시 결과 영역에 “이름 + 소개”를 출력한다.
2. 리소스 준비(이미지 넣기)
- 준비할 파일: 예) profile.png
- 넣는 위치: app/src/main/res/drawable/ 폴더
- 파일명 규칙: 소문자, 숫자, 언더스코어만 사용한다. 예) my_profile.png
3. XML (activity_main.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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<!-- 제목 -->
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="프로필 카드"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<!-- 프로필 이미지 -->
<ImageView
android:id="@+id/imgProfile"
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@drawable/profile"
android:contentDescription="프로필 이미지"
app:layout_constraintTop_toBottomOf="@id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"/>
<!-- 이름 입력 -->
<EditText
android:id="@+id/etName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="이름 입력"
android:inputType="textPersonName"
android:padding="12dp"
app:layout_constraintTop_toBottomOf="@id/imgProfile"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"/>
<!-- 한 줄 소개 입력 -->
<EditText
android:id="@+id/etIntro"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="한 줄 소개 입력"
android:inputType="text"
android:padding="12dp"
app:layout_constraintTop_toBottomOf="@id/etName"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="10dp"/>
<!-- 적용 버튼 -->
<Button
android:id="@+id/btnApply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="카드 만들기"
app:layout_constraintTop_toBottomOf="@id/etIntro"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="12dp"/>
<!-- 결과 출력 -->
<TextView
android:id="@+id/tvResult"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="결과가 여기에 표시된다."
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/btnApply"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="18dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
4. Kotlin (MainActivity.kt)
package com.example.helloandroid
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val etName = findViewById<EditText>(R.id.etName)
val etIntro = findViewById<EditText>(R.id.etIntro)
val btnApply = findViewById<Button>(R.id.btnApply)
val tvResult = findViewById<TextView>(R.id.tvResult)
btnApply.setOnClickListener {
val name = etName.text.toString().trim()
val intro = etIntro.text.toString().trim()
if (name.isBlank() || intro.isBlank()) {
tvResult.text = "이름과 소개를 모두 입력하여야 한다."
} else {
tvResult.text = "이름: $name\n소개: $intro"
}
}
}
}
- @drawable/profile에 해당하는 이미지가 drawable에 존재하여야 한다.
- 파일명이 다르면 @drawable/파일명도 동일하게 바꾸어야 한다.
과제
다음 조건을 만족하도록 수정하여 제출한다.
- 제목을 본인 수업명 또는 앱명으로 변경한다.
- 버튼 텍스트를 “저장”으로 변경한다.
- 결과 문구가 입력값 앞에 “소개: ”가 붙도록 변경한다.
- 예: 소개: 나는 안드로이드를 학습 중이다.
주요 태그 · 핵심 키워드 (3차시 실전 예제)
- <ConstraintLayout>
- <TextView>
- <EditText>
- <Button>
- android:hint
- android:inputType
- app:layout_constraintTop_toBottomOf
- findViewById
- setOnClickListener
- Total
- Today
- Yesterday