study gomi

[Android] 뒤로가기 막기 (stop + preventing backspace) kotlin 본문

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
반응형