[Android Compose] 1. DropDownMenu 이용해 펼쳐지는 메뉴 만들기

2021. 12. 12. 13:32· Android Jetpack Compose UI/Compose UIs
목차
  1. DropDownMenu란?
  2. Compose의 DropDownMenu
  3. DropDownMenu의 구성요소
  4. DropDownMenuItem의 구성요소
  5. DropDownMenu와 DropDownMenuItem을 이용해 DropDownMenu 만들기
  6. 1. DropDownMenu가 펼쳐졌는지를 제어할 수 있는 Boolean 변수를 Composable 내에 만든다.
  7. 2. 1에서 만든 변수를 제어할 수 있는 버튼을 만든다. 클릭 시 변수값이 true로 바뀌어 DropDownMenu가 펼쳐지도록 한다.
  8. 3. DropDownMenu 정의
  9. 4. 결과
반응형

DropDownMenu란?

DropDownMenu는 버튼을 눌렀을 때 선택지를 보여주는 메뉴 아이템이다. 동작은 그림1과 같다.

그림1. Drop Down Menu

 

Compose의 DropDownMenu

Compose의 Material package에서는 compose.ui.window 패키지의 Popup을 활용해서  DropDownMenu를 만드는 것을 지원한다. Popup을 활용함으로써 부모 Composable의 제약사항(크기 등)에 종속되지 않는 컴포저블을 만들 수 있다.

또한 Material package에서는 미리 디자인된 컴포저블인 DropDownMenuItem 또한 지원한다. DropDownMenuItem을 이용하면 DropDownMenu에 들어갈 아이템들을 쉽게 만들 수 있다.

 

우리는 이번 글에서 DropDownMenu와 DropDownMenuItem 두가지를 이용해 DropDownMenu를 만드는 방법을 다룬다.

 

DropDownMenu의 구성요소

DropDownMenu는 다음의 구성요소로 구성되어 있다.

  • expanded : DropDownMenu가 펼쳐졌는지 여부
  • onDismissRequest : DropDownMenu를 닫으라는 명령(Dismiss Request)이 떨어졌을 때의 동작
  • offset : DropDownMenu를 호출하는 Composable의 기준점으로부터의 거리(offset) 설정
  • properties : 백버튼을 눌렀을 때 DropDownMenu를 Dismiss 할 것인지, DropDownMenu의 바깥쪽을 눌렀을 때 Dismiss할 것인지 등의 DropDownMenu의 기본 동작을 정의.
  • content : DropDownMenu안에 들어갈 메뉴 아이템을 넣는 공간

*modifier은 Composable의 공통 사항이므로 다루지 않는다.

@Composable
fun DropdownMenu(
    expanded: Boolean,
    onDismissRequest: () -> Unit,
    modifier: Modifier = Modifier,
    offset: DpOffset = DpOffset(0.dp, 0.dp),
    properties: PopupProperties = PopupProperties(focusable = true),
    content: @Composable ColumnScope.() -> Unit
)

 

DropDownMenuItem의 구성요소

DropDownMenuItem은 다음의 구성요소로 구성되어 있다.

  • onClick : 메뉴 아이템이 눌렸을 때의 동작 정의
  • enabled : 메뉴 아이템을 클릭 가능하게 할 것인지 여부(눌렸을 때 onClick이 동작할 것인지 여부)
  • contentPadding : DropDownMenuItem에 적용할 Padding값
  • interactionSource : DropDownMenuItem과 사용자와의 Interaction에 대한 이벤트를 관리. 여기서는 클릭 이벤트만 다루므로 따로 다루지 않는다.
  • content : DropDownMenuItem에 표기할 요소 관리 (텍스트 등)
fun DropdownMenuItem(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    contentPadding: PaddingValues = MenuDefaults.DropdownMenuItemContentPadding,
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    content: @Composable RowScope.() -> Unit
)

 

이번 글에서는 기본적인 구성요소들을 이용해 DropDownMenu를 만드는 방법을 다루고

다른 구성요소들에 관해서는 다음 글에서 심화하면서 다룬다.

 

 

DropDownMenu와 DropDownMenuItem을 이용해 DropDownMenu 만들기

DropDownMenu를 위해서는 3가지의 구성요소가 필요하다.

  1. DropDownMenu가 펼쳐졌는지를 제어할 수 있는 변수
  2. DropDownMenu의 펼쳐짐 상태를 제어하기 위한 버튼 혹은 onClick이벤트를 포함한 Composable
  3. DropDownMenu 정의

 

자 이제 만들어보도록 하자.

1. DropDownMenu가 펼쳐졌는지를 제어할 수 있는 Boolean 변수를 Composable 내에 만든다.

@Composable
fun KotlinWorldButtonWithDropDownMenu() {
    // 1. DropDownMenu의 펼쳐짐 상태 정의
    var isDropDownMenuExpanded by remember { mutableStateOf(false) } 
}

isDropDownMenuExpanded 값은 Recomposition이 일어날 때 저장되어야 하고 state가 바뀔 때 Recomposition을 일어나도록 만들어야 한다. Recomposition 시 값을 저장하기 위해 remember을 쓰고, Composable 내에서 State를 인식할 수 있도록 Mutable State를 사용한다.

 

 

2. 1에서 만든 변수를 제어할 수 있는 버튼을 만든다. 클릭 시 변수값이 true로 바뀌어 DropDownMenu가 펼쳐지도록 한다.

@Composable
fun KotlinWorldButtonWithDropDownMenu() {
    // 1. DropDownMenu의 펼쳐짐 상태 정의
    var isDropDownMenuExpanded by remember { mutableStateOf(false) } 

    // 2. DropDownMenu의 Expanded 상태를 변경하기 위한 버튼 정의
    Button(
        onClick = { isDropDownMenuExpanded = true }
    ) {
        Text(text = "Show Menu")
    }
}

Button의 기능은 클릭이 일어났을 때 isDropDownMenuExpanded 변수를 true로 State를 바꾸게 해서 Recomposition이 일어나게 하는 것이다.

 

3. DropDownMenu 정의

@Composable
fun KotlinWorldButtonWithDropDownMenu() {
    // 1. DropDownMenu의 펼쳐짐 상태 정의
    var isDropDownMenuExpanded by remember { mutableStateOf(false) } 

    // 2. DropDownMenu의 Expanded 상태를 변경하기 위한 버튼 정의
    Button(
        onClick = { isDropDownMenuExpanded = true }
    ) {
        Text(text = "Show Menu")
    }

    // 3. DropDownMenu 정의
    DropdownMenu(
        modifier = Modifier
            .wrapContentSize(),
        expanded = isDropDownMenuExpanded,
        onDismissRequest = { isDropDownMenuExpanded = false }
    ) {
    	// 3.1. DropDownMenuItem을 정의하고 눌렸을 때 Hello가 출력되도록 함
        DropdownMenuItem(onClick = {
            println("Hello")
        }) {
            Text(text = "Print Hello")
        }
        // 3.2. DropDownMenuItem을 정의하고 눌렸을 때 KotlinWorld가 출력되도록 함
        DropdownMenuItem(onClick = {
            println("KotlinWorld")
        }) {
            Text(text = "Print KotlinWorld")
        }
    }
}

DropDownMenu의 expanded 파라미터 값으로 1에서 정의한 isDropDropMenuExpanded 변수를 넘기고 onDismissRequest가 발생했을 때 isDropDropMenuExpanded를 false로 변경하여 DropDownMenu가 사라지도록 만든다.

 

내부에는 DropDownMenuItem을 두 개 정의한다. 하나는 눌렸을 때 Hello가 출력되는 아이템이고, 다른 하나는 KotlinWorld가 출력되는 아이템이다.

 

4. 결과

이 세가지를 이용해 코드를 만들어 실행하면 다음과 같이 출력된다.

그림2. DropDownMenu 예시 결과

 

반응형
저작자표시 비영리 변경금지 (새창열림)
  1. DropDownMenu란?
  2. Compose의 DropDownMenu
  3. DropDownMenu의 구성요소
  4. DropDownMenuItem의 구성요소
  5. DropDownMenu와 DropDownMenuItem을 이용해 DropDownMenu 만들기
  6. 1. DropDownMenu가 펼쳐졌는지를 제어할 수 있는 Boolean 변수를 Composable 내에 만든다.
  7. 2. 1에서 만든 변수를 제어할 수 있는 버튼을 만든다. 클릭 시 변수값이 true로 바뀌어 DropDownMenu가 펼쳐지도록 한다.
  8. 3. DropDownMenu 정의
  9. 4. 결과


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Android Jetpack Compose UI/Compose UIs' 카테고리의 다른 글
  • [Jetpack Compose] ViewPager Tab Layout에 연결하기 : 스와이프해 탭 바꾸도록 만들기
  • [Android Compose] ViewPager 사용해 Swipe 되는 화면 만들기 : HorizontalPager 사용하기
  • [Android Compose] 2. offset사용하여 DropDownMenu가 펼쳐지는 위치 조정하기
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • 의존성 주입
  • junit4
  • github actions
  • gradle
  • Kotlin
  • Coroutine
  • 코틀린
  • Dependency Injection
  • github
  • Jetpack Compose
  • kotlin spring
  • Class
  • 스프링
  • flow
  • GIT
  • 유닛 테스팅
  • junit
  • 코루틴
  • HTTP
  • dagger2
  • 안드로이드
  • compose
  • GraphQL
  • Android Compose
  • Spring boot
  • junit5
  • Unit Testing
  • Android
  • Spring
  • java

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[Android Compose] 1. DropDownMenu 이용해 펼쳐지는 메뉴 만들기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.