안드로이드 메시지 박스(MessageBox) 띄우기 - AlertDialog 사용법 - 버전별 다이얼로그 테마 비교

개발/안드로이드1 2025. 11. 18. 08:09

안드로이드에서 "메시지 박스"라고 부르는 기능은 보통 AlertDialog를 말합니다.

사용자에게 안내 메시지를 보여주고, 확인/취소 같은 버튼을 붙여서 간단한 의사결정을 받는 용도로 많이 쓰이죠.

 

이번 글에서는

  1. 기본 AlertDialog(메시지 박스) 띄우는 코드
  2. 버튼 클릭 처리하는 방법
  3. Context, Activity에서 쓸 때 주의점
  4. 버전별로 스타일을 다르게 적용하는 예제와 분기 방식

 

까지 Android Java 기준으로 정리해보겠습니다.

 


 

1. 가장 기본적인 메시지 박스(AlertDialog) 띄우기

가장 단순한 형태는 제목, 내용, "확인" 버튼 하나만 있는 다이얼로그입니다.

Activity 안에서 아래처럼 작성하시면 됩니다.

import androidx.appcompat.app.AlertDialog;
import android.content.DialogInterface;

// 예: MainActivity 내부
private void showMessageBox() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("알림");
    builder.setMessage("메시지 박스를 띄웠습니다.");
    builder.setPositiveButton("확인", null);  // 아무 동작 없이 닫기

    AlertDialog dialog = builder.create();
    dialog.show();
}

포인트를 정리하면

  • AlertDialog.Builder(this)
    • 여기의 this는 Activity 컨텍스트입니다.
  • setTitle, setMessage로 제목/내용 설정
  • setPositiveButton("확인", null)
    • 버튼을 누르면 기본적으로 다이얼로그는 닫히고, 추가 동작은 하지 않습니다.

 

 


2. "확인" 버튼에 동작 달기

메시지 박스는 보통 "확인"을 눌렀을 때 뭔가 작업을 하죠.

이럴 때는 DialogInterface.OnClickListener를 달아주시면 됩니다.

private void showConfirmDialog() {
    new AlertDialog.Builder(this)
            .setTitle("삭제 확인")
            .setMessage("이 항목을 정말 삭제하시겠습니까?")
            .setPositiveButton("삭제", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO: 실제 삭제 처리 로직
                    deleteItem();
                }
            })
            .setNegativeButton("취소", null) // 취소는 별도 처리 없이 닫기
            .create()
            .show();
}

private void deleteItem() {
    // 삭제 로직 예시
}

 

  • setPositiveButtonsetNegativeButton에 리스너를 달아서 클릭 시 동작을 구현합니다.
  • which 파라미터에는 눌린 버튼의 ID가 들어오지만, 버튼별로 리스너를 나눠 쓰는 경우에는 잘 안 쓰기도 합니다.

 

3. Context, Activity에서 쓸 때 주의할 점

AlertDialog는 "화면" 위에 올라오는 UI 요소라서, Application 컨텍스트가 아니라 Activity 컨텍스트를 쓰는 것이 기본입니다.

대표적인 실수는 이런 식입니다.

// 이런 식은 피하는 게 좋습니다.
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

이렇게 하면 테마나 윈도우 토큰 문제로 예외가 나기도 합니다.

일반적으로는 아래처럼 사용하시는 게 안전합니다.

  • Activity 내부: new AlertDialog.Builder(this)
  • 익명 클래스 안에서 Activity를 명시하고 싶을 때: new AlertDialog.Builder(MainActivity.this)
  • Fragment 내부:
    • new AlertDialog.Builder(getActivity())
    • 또는 new AlertDialog.Builder(requireContext()) (Java에서는 주로 getActivity 사용)

 


 

4. 버전별로 다르게 처리해야 하는 부분

메시지 박스 자체는 버전에 따라 크게 달라지지는 않지만,

다이얼로그에 적용할 "테마"나 "스타일"을 버전별로 다르게 주고 싶을 때가 있습니다.

 

예를 들면

  • Lollipop(API 21) 이상: Material 스타일 다이얼로그
  • 그 미만: 기본(Holo) 스타일 다이얼로그

이런 식으로 나누고 싶을 수 있죠.

 

 

4-1. Build.VERSION.SDK_INT로 분기하기

안드로이드에서 버전 분기는 항상 이 패턴으로 갑니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Lollipop 이상에서만 쓸 수 있는 코드
} else {
    // 그 이하 버전용 코드
}

Build.VERSION_CODES 안에 각 안드로이드 버전이 상수로 정의되어 있고,

SDK_INT는 현재 실행 중인 디바이스의 API 레벨입니다.

 


4-2. 버전에 따라 다이얼로그 테마를 다르게 적용하는 예제

위 분기를 실제 AlertDialog에 적용한 예는 아래처럼 작성할 수 있습니다.

import android.os.Build;
import androidx.appcompat.app.AlertDialog;

private void showVersionAwareDialog() {
    AlertDialog.Builder builder;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // Lollipop 이상: Material 스타일
        builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Light_Dialog_Alert);
    } else {
        // 그 이하: 기본 스타일
        builder = new AlertDialog.Builder(this);
    }

    builder.setTitle("버전별 다이얼로그");
    builder.setMessage("OS 버전에 따라 다이얼로그 테마를 다르게 적용했습니다.");
    builder.setPositiveButton("확인", null);

    AlertDialog dialog = builder.create();
    dialog.show();
}

실무에서는 보통

  • android.app.AlertDialog가 아니라
  • androidx.appcompat.app.AlertDialog를 쓰고
  • 앱 전체 테마에서 다이얼로그 스타일을 통일시키는 편입니다.

그래서 위처럼 OS 버전에 따라 기본 테마를 직접 바꿔주는 경우는 줄었지만,

"버전별 분기해서 다른 코드를 실행한다"는 패턴 자체를 보여드리려고 예제로 넣었습니다.

 


 

4-3. AppCompat AlertDialog를 사용하는 이유

코드 상단에 이런 import를 쓰고 있죠.

import androidx.appcompat.app.AlertDialog;

이렇게 AppCompat 버전의 AlertDialog를 쓰면 좋은 점은

  • 예전 OS 버전에서도 최신 디자인(또는 비슷한 느낌)을 최대한 맞춰준다
  • AppCompatActivity와 같이 쓰면서 다크 모드, 테마 관리 등을 통일하기 좋다

라는 장점이 있어서, 요즘은 거의 이 방식으로만 사용한다고 보셔도 됩니다.

버전 호환은

  • “앱의 최소 지원 버전(minSdk)“은 낮게 가져가되
  • UI 컴포넌트는 AppCompat/AndroidX에서 알아서 처리하도록 맡긴다

이런 느낌으로 이해하시면 편합니다.

 


 

5. 커스텀 레이아웃을 쓰는 메시지 박스 예제 (덤)

조금 더 나아가서, 버튼 말고 EditText 등을 넣어서 간단한 입력창처럼 쓰고 싶을 수도 있습니다.

레이아웃 파일(예: dialog_input.xml)을 하나 만들고:

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

    <EditText
        android:id="@+id/editTextName"
        android:hint="이름을 입력하세요"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Java에서는 이렇게 사용합니다.

private void showInputDialog() {
    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.dialog_input, null);

    final EditText editTextName = view.findViewById(R.id.editTextName);

    new AlertDialog.Builder(this)
            .setTitle("이름 입력")
            .setView(view)
            .setPositiveButton("확인", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String name = editTextName.getText().toString();
                    // 입력 값 사용
                    handleName(name);
                }
            })
            .setNegativeButton("취소", null)
            .create()
            .show();
}

private void handleName(String name) {
    // 입력된 이름을 사용하는 로직
}

이렇게 하면 단순 메시지 박스를 넘어서,

간단한 입력 다이얼로그까지 구현할 수 있습니다.

 


 

정리하자면..

  • 안드로이드에서 "메시지 박스"는 보통 AlertDialog를 사용해서 구현합니다.
  • 가장 기본 형태는 제목, 메시지, "확인" 버튼 하나만 있는 다이얼로그입니다.
  • 버튼 클릭 시 동작이 필요하면 setPositiveButton, setNegativeButton에 리스너를 달아서 처리합니다.
  • AlertDialog는 Activity 컨텍스트(this, MainActivity.this, getActivity())를 사용하는 것이 안전합니다.
  • 버전별로 다른 동작을 하고 싶을 때는 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.XXX) 패턴으로 분기합니다.
    • 예: Lollipop 이상에서만 Material 스타일 다이얼로그를 적용
  • 실무에서는 androidx.appcompat.app.AlertDialog를 쓰면서, AppCompat/AndroidX가 버전별 차이를 어느 정도 흡수하도록 맡기는 방식이 일반적입니다.
  • 필요하면 커스텀 레이아웃을 붙여서 입력 다이얼로그처럼 확장해서 사용할 수 있습니다.
반응형
admin