Android Studio/View & Widgets

Views와 ViewGroup

shDev 2026. 2. 8. 20:34

Android UI 개발 완벽 정리

1. Views와 ViewGroup의 개념

비유로 이해하기

  • 큰 상자(ViewGroup) 안에 작은 상자들(Views)이 들어있는 구조
  • ViewGroup = 컨테이너 역할
  • Views = 실제 화면에 표시되는 요소들

View의 특징

  • 각각의 View는 고유한 기능을 수행
  • 예시: Button은 탭하면 게임 시작, 메시지 전송 등의 동작 실행

ViewGroup의 역할

  • 여러 View들을 조직화(organize)
  • 화면에 View들을 배치(arrange)

2. Android Studio 프로젝트 구조

새 프로젝트 생성 시 기본 파일

  1. MainActivity.java (또는 .kt)
    • Java 또는 Kotlin 코드 작성
    • 앱의 로직과 기능 구현
  2. activity_main.xml
    • Layout 파일 (XML)
    • 사용자 인터페이스(UI) 디자인

3. Android Studio Layout Editor - 3가지 모드

1) Design Mode (디자인 모드)

특징

  • 레이아웃의 시각적 표현 제공
  • 드래그 앤 드롭 방식으로 UI 디자인
  • 실시간 프리뷰 확인 가능

사용 방법

  • Palette에서 TextView, Button, ImageView 등 드래그
  • UI 요소 추가/제거 및 위치 조정
  • Constraints 설정
  • Attributes 탭에서 속성 수정

2) Code Mode (코드 모드)

특징

  • XML 코드 직접 편집
  • UI 레이아웃과 속성을 코드로 정의
  • 세밀한 제어 가능

3) Split Mode (분할 모드)

특징

  • Design + Code 모드 결합
  • 시각적 표현과 XML 코드를 동시에 확인
  • 양방향 실시간 동기화

작동 방식

Split Mode에서:
Design 영역에서 Button 추가
    ↓
Code 영역에 XML 자동 생성
    ↓
실시간 반영

4. View Attributes (공통 속성)

정의

View Attributes는 각 UI 요소가 어떻게 보이고 동작할지를 정의하는 속성들입니다.

주요 공통 Attributes

1. ID (식별자)

android:id="@+id/myTextView"
  • 뷰에 고유한 ID 할당
  • Java/Kotlin 코드에서 이 ID로 뷰를 참조하여 프로그래밍 방식으로 조작

2. Layout Width & Height (너비와 높이)

android:layout_width="match_parent"
android:layout_height="wrap_content"
  • match_parent: 부모 뷰(전체 레이아웃)에 맞춤
  • wrap_content: 내용물 크기에 맞춤
  • 고정 크기: 예) 200dp

3. Margin (외부 여백)

android:layout_margin="20dp"
  • 뷰 주변의 외부 공간
  • 다른 요소와의 간격 설정
  • layout_marginLeft, layout_marginRight, layout_marginTop, layout_marginBottom으로 개별 지정 가능

4. Padding (내부 여백)

android:padding="40dp"
  • 뷰의 내부 공간
  • 뷰의 콘텐츠와 경계 사이의 간격
  • paddingLeft, paddingRight, paddingTop, paddingBottom으로 개별 지정 가능

5. Background (배경)

android:background="#00FF00"
  • 뷰의 배경색 또는 drawable 설정

 5. TextView Widget

정의

TextView는 화면에 텍스트를 표시하는 기본 UI 요소입니다.

TextView 생성 방법

1. XML 코드로 작성

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/myTextView"
    android:text="Hello my friends"
    android:textSize="32sp"
    android:textColor="#FF0000"
    android:textStyle="bold" />

2. Design Mode에서 드래그 앤 드롭

  • Palette에서 TextView 검색
  • 원하는 위치로 드래그

TextView 주요 Attributes

텍스트 관련 속성

속성 설명 예시

android:text 표시할 텍스트 내용 "Hello my friends"
android:textSize 텍스트 크기 32sp
android:textColor 텍스트 색상 "#FF0000" (빨강)
android:textStyle 텍스트 스타일 bold, italic, normal
android:textAllCaps 모든 글자를 대문자로 true / false
android:gravity 텍스트 정렬 center, start, end
android:typeface 폰트 스타일 serif, sans, monospace

레이아웃 속성

<TextView
    android:padding="20dp"
    android:layout_margin="20dp"
    android:background="#00FF00" />

Input Type (입력 타입)

android:inputType="text"
  • text, textPassword, number, phone, email, date, time 등

단위 설명

  • sp (Scaled Pixels): 텍스트 크기에 사용, 사용자의 글꼴 크기 설정에 따라 조정됨
  • dp (Density-independent Pixels): 화면 밀도에 관계없이 일관된 크기 제공

Attributes 설정 방법

1. XML 코드에서 직접 설정

android:textColor="#0000FF"

2. Attributes 패널에서 시각적으로 설정

  • 오른쪽 Attributes 패널 사용
  • 색상 피커로 색상 선택
  • 드롭다운에서 옵션 선택

 6. EditText Widget

정의

EditText는 사용자가 텍스트를 입력할 수 있는 편집 가능한 UI 요소입니다.

EditText 생성 방법

1. XML 코드로 작성

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Enter your name"
    android:inputType="text" />

2. Design Mode에서 드래그 앤 드롭

  • Plain Text, Password, Email 등 다양한 형태의 EditText 사용 가능

EditText 주요 Attributes

텍스트 및 힌트

속성 설명 예시

android:text 초기 텍스트 내용 "Enter your name"
android:hint 빈 상태일 때 표시되는 힌트 "Enter your name"
android:inputType 입력 유형 지정 text, number, textPassword, textEmailAddress, phone
android:maxLength 최대 입력 가능 문자 수 10

text vs hint 차이

  • text: EditText의 초기 텍스트 내용 (실제 값)
  • hint: 비어있을 때 표시되는 가이드 텍스트 (사용자가 클릭하면 사라짐)

스타일 속성

<EditText
    android:textColor="#000000"
    android:textSize="20sp"
    android:textStyle="bold"
    android:padding="20dp"
    android:layout_margin="20dp" />

EditText 프로그래밍 방식 사용

MainActivity.java에서 초기화 및 입력 받기

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 1. EditText 초기화
        EditText myEditText = findViewById(R.id.editText);
        
        // 2. 사용자 입력 받기
        String inputText = myEditText.getText().toString();
        
        // inputText 변수에 사용자가 입력한 텍스트가 저장됨
    }
}

주요 메서드

  • getText(): EditText에서 입력된 텍스트 가져오기
  • toString(): Editable 객체를 String으로 변환

 7. Button Widget

정의

Button은 사용자가 클릭/탭하여 동작을 실행할 수 있는 기본 UI 요소입니다.

Button 생성 방법

XML 코드로 작성

<Button
    android:id="@+id/myButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me"
    android:textSize="32sp"
    android:textStyle="bold"
    android:padding="30dp"
    android:layout_margin="40dp" />

Button 주요 Attributes

텍스트 및 스타일

속성 설명 예시

android:text 버튼에 표시될 텍스트 "Click Me"
android:textSize 텍스트 크기 32sp
android:textStyle 텍스트 스타일 bold

상호작용 속성

속성 설명 값

android:clickable 클릭 가능 여부 true / false
android:enabled 버튼 활성화 여부 true / false
  • clickable="false": 사용자가 클릭할 수 없음
  • enabled="false": 버튼이 비활성화되어 클릭에 반응하지 않음

⚠️ onClick 속성 (비추천)

android:onClick="methodName"
  • XML에서 직접 메서드 지정 (Deprecated)
  • 추천하지 않음: 항상 Java/Kotlin 코드에서 처리하는 것이 좋음

8. View 초기화 및 선언 (findViewById)

개념

XML 레이아웃에 정의된 UI 요소(View)를 Java/Kotlin 코드에서 참조하여 프로그래밍 방식으로 조작하는 과정입니다.

기본 프로세스

1. XML에서 ID 정의

<TextView
    android:id="@+id/myTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World" />

2. MainActivity.java에서 초기화

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // findViewById로 뷰 초기화
        TextView myTextView = findViewById(R.id.myTextView);
        
        // 프로그래밍 방식으로 속성 변경
        myTextView.setText("새로운 텍스트");
        myTextView.setTextColor(Color.BLUE);
        myTextView.setTextSize(24);
    }
}

findViewById 메서드

구조

ViewType viewVariable = findViewById(R.id.viewId);

동작 방식

  1. findViewById: Android 프레임워크가 제공하는 메서드
  2. R.id.viewId: XML에서 정의한 ID로 뷰 검색
  3. 반환값: 지정된 ID를 가진 뷰 객체의 참조

예시

// TextView 초기화
TextView myTextView = findViewById(R.id.myTextView);

// EditText 초기화
EditText myEditText = findViewById(R.id.editText);

// Button 초기화
Button myButton = findViewById(R.id.myButton);

TextView 조작 메서드

TextView myTextView = findViewById(R.id.myTextView);

// 다양한 메서드 사용 가능
myTextView.setText("새 텍스트");
myTextView.setTextColor(Color.RED);
myTextView.setTextSize(20);
myTextView.setVisibility(View.VISIBLE); // 또는 INVISIBLE, GONE

⚠️ 중요 주의사항

1. ID가 존재해야 함

  • XML 레이아웃 파일에 지정한 ID가 반드시 존재해야 함
  • ID가 고유해야 함 (중복 불가)

2. null 체크

TextView myTextView = findViewById(R.id.myTextView);
if (myTextView != null) {
    myTextView.setText("안전한 접근");
} else {
    // ID를 찾지 못했을 때 처리
}

3. NullPointerException 방지

  • ID가 잘못되었거나 뷰를 찾을 수 없으면 null 반환
  • null 체크 없이 사용하면 NullPointerException 발생

9. Click Listener (클릭 이벤트 처리)

정의

Click Listener는 사용자의 클릭/탭 동작을 감지하고 반응하는 인터페이스입니다.

OnClickListener 구현

기본 구조

Button myButton = findViewById(R.id.myButton);

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 버튼 클릭 시 실행될 코드
    }
});

onClick 메서드

  • 파라미터: View v (클릭된 뷰 객체)
  • 호출 시점: 사용자가 UI 요소를 클릭할 때
  • 용도: 클릭에 대한 원하는 동작 정의

실전 예제

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button myButton = findViewById(R.id.myButton);
        
        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Toast 메시지 표시
                Toast.makeText(MainActivity.this, 
                              "You clicked a button", 
                              Toast.LENGTH_SHORT).show();
            }
        });
    }
}

10. Toast (토스트 메시지)

정의

Toast는 사용자에게 간단한 메시지나 피드백을 일시적으로 표시하는 작은 알림입니다.

Toast 특징

  • 화면 하단에 나타남
  • 짧은 시간(약 2-3초) 후 자동으로 사라짐
  • 사용자 상호작용 필요 없음
  • 앱 실행을 방해하지 않음

Toast 생성 방법

기본 구문

Toast.makeText(Context, "메시지", Duration).show();

파라미터

  1. Context: 일반적으로 MainActivity.this 또는 getApplicationContext()
  2. 메시지: 표시할 텍스트 (String)
  3. Duration:
    • Toast.LENGTH_SHORT (약 2초)
    • Toast.LENGTH_LONG (약 3.5초)

실전 예제

// 버튼 클릭 시 Toast 표시
Button myButton = findViewById(R.id.myButton);

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, 
                      "You clicked a button", 
                      Toast.LENGTH_SHORT).show();
    }
});

11. 전체 실습 예제

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp">

    <!-- TextView -->
    <TextView
        android:id="@+id/myTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello my friends"
        android:textSize="32sp"
        android:textColor="#FF0000"
        android:textStyle="bold"
        android:layout_margin="20dp" />

    <!-- EditText -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name"
        android:inputType="text"
        android:textSize="20sp"
        android:layout_margin="20dp" />

    <!-- Button -->
    <Button
        android:id="@+id/myButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me"
        android:textSize="24sp"
        android:padding="30dp"
        android:layout_margin="40dp" />

</LinearLayout>

MainActivity.java

package com.example.myapp;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    
    // View 변수 선언
    private TextView myTextView;
    private EditText myEditText;
    private Button myButton;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 1. findViewById로 뷰 초기화
        myTextView = findViewById(R.id.myTextView);
        myEditText = findViewById(R.id.editText);
        myButton = findViewById(R.id.myButton);
        
        // 2. 버튼 클릭 리스너 설정
        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // EditText에서 입력받은 텍스트 가져오기
                String inputText = myEditText.getText().toString();
                
                // TextView에 입력받은 텍스트 설정
                myTextView.setText(inputText);
                
                // Toast 메시지 표시
                Toast.makeText(MainActivity.this, 
                              "You clicked a button", 
                              Toast.LENGTH_SHORT).show();
            }
        });
    }
}

📊 작업 모드 비교

모드 특징 장점 적합한 경우

Design 시각적 편집 직관적, 빠른 프로토타이핑 초보자, 빠른 UI 스케치
Code XML 직접 편집 정확한 제어, 세밀한 조정 경험자, 복잡한 레이아웃
Split 양쪽 동시 표시 실시간 확인, 학습에 유용 학습 중, 디버깅 시

핵심 정리

Widgets 비교

Widget 용도 주요 특징

TextView 텍스트 표시 읽기 전용, 다양한 스타일링
EditText 텍스트 입력 사용자 입력 받기, 키보드 표시
Button 동작 실행 클릭 이벤트 처리

속성(Attributes) 설정 방법

방법 1: XML 코드

android:textColor="#FF0000"
android:textSize="32sp"

방법 2: Attributes 패널

  • 시각적 편집기 사용
  • 색상 피커, 드롭다운 메뉴

방법 3: Java/Kotlin 코드 (런타임)

myTextView.setTextColor(Color.RED);
myTextView.setTextSize(32);

XML vs Java/Kotlin

측면 XML Java/Kotlin

시점 컴파일 타임 (정적) 런타임 (동적)
용도 초기 레이아웃 구성 동적 변경 및 상호작용
장점 구조화, 유지보수 쉬움 유연성, 조건부 처리

중요 개념 요약

1. View Hierarchy (뷰 계층 구조)

Activity
  └── Layout (ViewGroup)
        ├── TextView
        ├── EditText
        └── Button

2. findViewById 패턴

XML에서 ID 정의 → Java에서 findViewById() → 뷰 객체 참조 → 조작

3. Event Handling (이벤트 처리)

View 초기화 → setOnClickListener() → onClick() 구현 → 동작 정의