테마 설정
아래와 같이 values/themes.xml (or styles.xml) 내에 style을 선언합니다.
<style name="AppTheme.NoActionbar.Translucent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/transparent</item>
<item name="colorPrimaryDark">@color/transparent</item>
<item name="colorAccent">@color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
주의점
위와 같이 액티비티 배경을 투명하게 설정해도 투명해지지 않는 이슈를 발견
정확하게는 액티비티가 투명해졌다가 전환 애니메이션이 끝나면 다시 불투명하게 돌아오게되는 현상
앱의 데이터를 지우니 다시 투명하게 유지가 되었고, 액티비티를 몇 번 반복하여 호출하다보니 다시 재현 됨
컬러나 설정 등이 캐싱되고 있는 것 같아 아래와 같이 선언해주니 해결 됨
<item name="android:colorBackgroundCacheHint">@null</item>
Android Oreo에서 투명 액티비티 적용 안되는 이슈
Android Oreo(8.0)에서만 투명 액티비티가 적용이 되지 않는 이슈를 발견
에러 문구
- "Only fullscreen opaque activities can request orientation"
에러 원인
투명 액티비티 적용을 위해 아래와 같이 선언해두으나, screenOrientation="portrait"와 "android:windowIsTranslucent" 속성을 같이 선언하면 크래시 발생
// AndroidManifest.xml
<activity
android:name=".v2.view.fairy.tutorial.FairyTutorialActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionbar.Translucent"/>
// styles.xml (v26)
<style name="AppTheme.NoActionbar.Translucent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/transparent</item>
<item name="colorPrimaryDark">@color/transparent</item>
<item name="colorAccent">@color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
</style>
API 26(8.0) SDK에서 Activity 내에 아래와 같은 코드가 추가 되어있음
API 26에서 투명 액티비티는 화면 회전 고정이 불가능하게 의도한 것
해결 방법
Android Oreo(8.0)에서만 ScreenOrientation 속성 미적용
투명 액티비티의 screenOrientation="unspecified" 로 설정
<activity
android:name=".example.TransparentActivity"
android:exported="false"
android:screenOrientation="unspecified"
android:theme="@style/AppTheme.NoActionbar.Translucent"/>
onCreate 시점에 코드로 ScreenOrientation 설정
단, Oreo에서는 해당 코드를 호출하지 않음
override fun onCreate(savedInstanceState: Bundle?) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
// setRequestOrientation 메소드를 오버라이드하여 Oreo에서는 호출하지 않도록 처리
override fun setRequestedOrientation(requestedOrientation: Int) {
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
super.setRequestedOrientation(requestedOrientation)
}
}
단, 이 방법은 Oreo에서 액티비티가 회전이 가능하도록 설정 되므로 화면 회전시 문제가 없는지는 테스트가 필요
'안드로이드 > 이론' 카테고리의 다른 글
[ 안드로이드 ] LocalBroadcaseManager Deprecated 대응 (0) | 2024.07.12 |
---|---|
[ 안드로이드 ] 앱 내에 개발자 모드 추가하기 3 (0) | 2024.05.16 |
[ 안드로이드 ] Multi ViewType RecyclerView ViewHolder 순서 고정하기 (0) | 2024.01.14 |
[ 안드로이드 ] 앱 내에 개발자 모드 추가하기 2 (0) | 2023.12.29 |
[ 안드로이드 ] 개발자의 실수를 줄여주는 어노테이션 (0) | 2023.12.12 |