Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코루틴
- dart
- 웹뷰
- studio
- RecyclerView
- 레트로핏
- Kotlin
- 안드로이드스튜디오
- MVVM
- build
- viewpager
- Android
- 유튜브
- WebView
- 안스
- error
- 깃헙
- 코틀린
- 스튜디오
- Github
- 안드로이드
- Gradle
- Retrofit
- 안드로이드 스튜디오
- GIT
- image
- coroutine
- 에러
- 의존성주입
- ADB
Archives
- Today
- Total
코딩하는 일용직 노동자
Compose enableEdgeToEdge를 이용해 전체화면 구현하기. 본문
기본적인 Compose로 구현하는 화면은 상단에 statusBar가 있고 아래에 navigationBar가 있는 형태입니다.
modifier에 statusBarsPadding() navigationBarsPadding()를 추가해서 상단과 하단의 영역을 제외한 나머지 영역을 사용하도록 합니다.
하지만 요즘은 이 영역을 모두 사용해서 더 이쁘게 앱을 만드는 추세입니다.
Jetpack Compose에서 전체화면을 사용해 컨텐츠를 표시하는 방법을 알아보겠습니다.
코드를 통해 확인해봅시다.
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun MyScreen() {
Scaffold {
Column(
modifier = Modifier
.fillMaxSize()
.statusBarsPadding()
.navigationBarsPadding()
.background(Color(0xFFafeeee)),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Screen Top")
Text("Screen Bottom")
}
}
}
이제 statusBar와 navigationBar를 모두 사용해서 전체화면으로 만들어보겠습니다.
Activity의 onCreate에서 enableEdgeToEdge를 호출하여 앱의 더 넓은 디스플레이를 사용 설정할 수 있습니다.
이때 주의할것이 있습니다. setContentView 전에 호출해야 합니다.
enableEdgeToEdge의 구성을 보도록 하겠습니다.
인자로 statusBarStyle: SystemBarStyle, navigationBarStyle: SystemBarStyle 를 받습니다.
추가해줍니다.
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.light(
Color.Transparent.toArgb(), Color.Transparent.toArgb()
),
navigationBarStyle = SystemBarStyle.light(
Color.Transparent.toArgb(), Color.Transparent.toArgb()
)
)
...
}
뭔가 달라지긴 했지만 원했던 전체화면은 여전히 아닙니다.
ui.theme/Theme.kt 파일에서 수정을 더 해줘야합니다.
Theme.kt 의 가운데에 아래의 소스코드가 있습니다.
if (!view.isInEditMode) {
SideEffect {
val window = (view.context as Activity).window
window.statusBarColor = colorScheme.primary.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
}
}
여기서 window.statusBarColor 와 .isAppearanceLightStatusBars 를 수정해줘야 합니다.
아래 코드로 수정해줍니다.
SideEffect {
val window = (view.context as Activity).window
window.statusBarColor = Color.Transparent.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
}
이제 statusBar와 navigationBar를 모두 사용해서 앱을 표시해줄 수 있습니다.
하지만 위,아래 영역이 겹치니 컨텐츠를 표시할 패딩이 필요합니다.
아래처럼 소스코드를 수정해줍니다.
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun MyScreen() {
Scaffold {
Column(
modifier = Modifier
.fillMaxSize()
// .statusBarsPadding()
// .navigationBarsPadding()
.background(Color(0xFFafeeee))
.padding(top = it.calculateTopPadding())
.padding(bottom = it.calculateBottomPadding()),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Screen Top")
Text("Screen Bottom")
}
}
}
완성입니다.
전체 소스코드를 아래에 두겠습니다.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.light(
Color.Transparent.toArgb(), Color.Transparent.toArgb()
),
navigationBarStyle = SystemBarStyle.light(
Color.Transparent.toArgb(), Color.Transparent.toArgb()
)
)
super.onCreate(savedInstanceState)
setContent {
MyComposeExTheme {
MyScreen()
}
}
}
}
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun MyScreen() {
Scaffold {
Column(
modifier = Modifier
.fillMaxSize()
// .statusBarsPadding()
// .navigationBarsPadding()
.background(Color(0xFFafeeee))
.padding(top = it.calculateTopPadding())
.padding(bottom = it.calculateBottomPadding()),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Screen Top")
Text("Screen Bottom")
}
}
}
'안드로이드' 카테고리의 다른 글
CoroutineFlow Operator의 종류 (0) | 2024.03.17 |
---|---|
ViewModelProvider.Factory를 이용해 파라메터가 있는 ViewModel 생성하기. (0) | 2024.03.15 |
LifecycleEventObserver를 이용한 Activity가 아닌 클래스에 라이프사이클을 연결. (0) | 2024.03.05 |
aab, apk 빌드시 파일명 자동 생성하는 방법. (0) | 2024.01.31 |
Can't determine type for tag 빌드에러 수정 (0) | 2023.09.25 |