App/Android
[Android] 뒤로가기 막기 (stop + preventing backspace) kotlin
공부하곰
2024. 10. 18. 09:35
728x90
반응형
(공통)
MainActivity에 추가
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 기존 코드들...
// 뒤로가기 버튼을 무시하는 코드
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// 아무 동작도 하지 않음으로써 뒤로가기 기능을 막음
}
})
}
(jetpack compose)
1. MainActivity에서 시스템 차원의 제어
: onBackPressedDispatcher를 사용하여 뒤로가기 버튼을 제어
( MainActivity에 추가 → Compose 기반 UI에서도 뒤로가기 막아짐)
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
// Compose UI 코드
MyApp()
// 뒤로가기 버튼을 무시하는 코드
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// 뒤로가기 버튼 동작을 막음
}
})
}
}
}
2. Compose 자체에서 제공하는 BackHandler 사용
: Jetpack Compose에서 뒤로가기 버튼의 동작을 제어하기 위한 함수
(뒤로가기 버튼을 눌렀을 때 수행할 동작을 지정하는 Composable 함수로 특정 Composable 범위 내에서 뒤로가기 버튼을 제어할 수 있고 사용이 매우 간단함.)
BackHandler를 활용하여 뒤로가기 막기
@Composable
fun DisableBackPress() {
// BackHandler의 enabled를 항상 true로 설정하여 뒤로가기 버튼을 완전히 막음
BackHandler(enabled = true) {
// 아무것도 하지 않음
}
}
추가) BackHandler 기본 사용 - 특정 동작
import androidx.activity.compose.BackHandler
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.Dialog
@Composable
fun MyComposable() {
var showDialog by remember { mutableStateOf(false) }
// BackHandler로 뒤로가기 버튼 제어
BackHandler(enabled = showDialog) {
// 뒤로가기 버튼을 눌렀을 때 수행할 동작
showDialog = false // 다이얼로그를 닫는 동작
}
Button(onClick = { showDialog = true }) {
Text(text = "Show Dialog")
}
if (showDialog) {
Dialog(onDismissRequest = { showDialog = false }) {
Surface {
Text("Dialog is open! Press back to close.")
}
}
}
}
@Preview
@Composable
fun PreviewMyComposable() {
MyComposable()
}
둘 중 어떤 것?
Compose 자체에서는 BackHandler라는 함수가 제공되지만 MainActivity에서 시스템 차원의 제어를 할 때는 여전히 onBackPressedDispatcher를 사용하는 방식이 적합. 왜냐하면 BackHandler는 Composable 내부에서만 동작하므로 Activity 전체에서 뒤로가기를 차단하는 데는 적합하지 않음.
특정 composable 범위에서만 뒤로가기 막을 때는 BackHandler가 적합.
728x90
반응형