Drawer : 서랍
DrawerLayout은 서랍이 열리고 닫히는 것처럼 평소에는 화면 한쪽에 숨겨져 있다가 사용자가 액션을 취하면 화면에 나타나는 기능을 만들 수 있게 해주는 레이아웃.
하지만 Layout 자체가 화면에서 나타나거나 사라지는 동작을 수행하는 것은 아니다! DrawerLayout에 추가된 자식이 Layout 안에서 서랍과 같은 동작을 수행하는 것.
자식들 중 layout_gravity 속성값을 가지지 않은 자식들은 기본적으로 표시되는 주화면, layout_gravity 속성값을 가진 자식만 Drawer로서 동작 지정된 left or right로 열림.
기본적으로 두개의 자식이 필요하다. 하나는 Drawer가 표시되지 않은 상태인 주 화면, 다른 하나는 Drawer 역할을 수행할 화면
layout_gravity = "left"
혹은layout_gravity = "start"
=> 왼쪽에서 열리는 Drawer
layout_gravity = "right"
혹은layout_gravity = "end"
=> 오른쪽에서 열리는 Drawer
Drawer가 왼쪽과 오른쪽에서 하나씩 열리도록 지정할 수 있지만 한 방향에서 두개의 Drawer를 열리게 할 수는 없다.
Drawer는 너비는 DrawerLayout보다 작은 고정값, 높이는 DrawerLyaout의 높이와 같은 match parent로 지정하는 것이 일반적이다. 물론 Drawer가 아닌 주화면은 DrawerLayout의 전체 영역에 표시되므로 주화면인 DrawerLayout의 첫번째 자식은 너비와 높이가 match parent이다.
DrawerLayout에서 제공되는 함수를 호출하면 외부 버튼 또는 메뉴를 통해 열리거나 닫히게 할 수 있다.
openDrawer 종류
closeDrawer 종류
Drawer를 열린 상태 혹은 닫힌 상태로 고정시키는 것.
DrawerLayout의 setDrawerLockMode() 함수를 통해 Drawer 잠그기 기능을 활성화|비활성화
잠겨있는 상태에서 Swipe로 열고 닫을 수 없지만 함수 openDrawer()나 closeDrawer로는 열고 닫을 수 있다.
사용하 레이아웃은 아래와 같은 구성
val buttonOpen = findViewById<Button>(R.id.open)
buttonOpen.setOnClickListener {
val drawer = findViewById<DrawerLayout>(R.id.drawer)
if (!drawer.isDrawerOpen(Gravity.LEFT)) {
drawer.openDrawer(Gravity.LEFT)
}
}
val buttonClose = findViewById<Button>(R.id.close)
buttonClose.setOnClickListener {
val drawer = findViewById<DrawerLayout>(R.id.drawer)
if (drawer.isDrawerOpen(Gravity.LEFT)) {
drawer.closeDrawer(Gravity.LEFT)
}
}
val checkboxLock = findViewById<CheckBox>(R.id.lock)
checkboxLock.setOnClickListener {
val drawer = findViewById<DrawerLayout>(R.id.drawer)
if (checkboxLock.isChecked()) {
if (drawer.isDrawerOpen(Gravity.LEFT)) {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN)
} else {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
}
} else {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
}
}
왼쪽 Edge와 오른쪽 Edge에 Drawer로 동작하는 자식을 만들 수 있다. 단, 왼쪽 Edge나 오른쪽 Edge에 두개 이상의 Drawer를 만들 수 없다.
만약 오른쪽 Edge에는 Drawer가 없다고 하자. 이 때 drawer.openDrawer(Gravity.RIGHT)로 Drawer를 열려고 시도한다면 에러가 발생한다.
출처 :
https://recipes4dev.tistory.com/139
https://soohyun6879.tistory.com/77
https://duzi077.tistory.com/167
https://developer.android.com/reference/androidx/drawerlayout/widget/DrawerLayout