
Android Studio에서 프로젝트를 생성하면 res/values/themes에 자동으로 themes.xml(night) 파일이 생성됩니다.
이 파일의 스타일 설정을 아직 바꿔주지 않아서 잘못 출력이 됐었는데, themes.xml 파일 내 코드 수정을 통해 해결했습니다.
수정사항 [themes.xml(night)]
이전:
parent="Theme.MaterialComponents.DayNight.DarkActionBar"
이후:
parent="Theme.MaterialComponents.Light.NoActionBar"
향후 다크모드도 추가할 수 있게 되면 좋겠습니다.
Andoid 12부터는 개발자가 splash screen을 특별히 설정하지 않아도
windowBackground + App Icon 조합으로 splash screen이 자동으로 제공됩니다.
Google을 통해 찾아본 결과, 이전에는 Splash Activity를 생성하고 App 시작 시 생성된 초기 액티비티로 설정하여 splash screen을 보여주는 방식이 가장 보편적이었던 것 같습니다.
하지만 이 경우 API 31 이상의 버전에서는
1) android가 자동으로 생성한 splash screen + 2) Splash Activity 통해 보여지는 splash screen
총 2번의 splash screen을 사용자가 보게 됩니다.
따라서 Vote22에서는 splash screen api를 사용하여 splash screen을 구현하였습니다.
SplashScreen library
build.gradle에서 dependency를 추가해줍니다.
현재 developer.android.com에서 확인 가능한 버전은 1.0.0-beta01 이었습니다.
implementation 'androidx.core:core-splashscreen:1.0.0-beta01'
res/styles.xml에 style 추가
<style name='Theme이름' parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">배경 컬러</item>
<item name="windowSplashScreenAnimatedIcon">사용할 아이콘</item>
<item name="postSplashScreenTheme">Splash Screen 종료 후 사용할 Theme</item>
</style>
https://developer.android.com/reference/kotlin/androidx/core/splashscreen/SplashScreen
에서 디자인 등 자세한 사항들을 확인할 수 있습니다.
AndroidManifest.xml에서 theme 변경
android:theme="@style/Theme이름"
Main Activity에 코드 추가
import androidx.core.splashscreen.SplashScreen;
@Override
protected void onCreate(Bundle savedInstanceState) {
SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
자동 import 쓰신다면, android.window.SplashScreen로 import되지 않게 주의! (경험담)
현재 Vote22에서 추세선 그래프를 표시하는 프로세스는 다음과 같습니다.
이 때 여론조사 → 추세선 탭으로 넘어가는 과정에서
여론조사 fragment에서 view model에 아직 데이터가 등록되지 않은 경우 NullPointException이 발생하는 것을 확인했습니다.
통신속도에 문제가 있을 경우 앱이 비정상 종료될 수 있기 때문에, 이 부분에 대한 수정이 필요했습니다.
여론조사 fragment에서 view model에서 받아온 데이터가 null 인 경우를 예외처리 해주고
Live data의 observe() 메소드를 사용하여 데이터 변경 시 추세선 그래프를 새로 작성할 수 있도록 변경
surveyViewModel.getSurveyResultList().observe(getViewLifecycleOwner(), new Observer<List<SurveyResult>>() {
@Override
public void onChanged(List<SurveyResult> surveyResultList) {
//live data 변경 시 실행 코드
}
});

Live Data가 변경되지 않았음에도 onChanged가 호출되는 문제
RecyclerView Adapter
현재 adapter가 데이터의 추가, 제거 등의 업데이트를 반영할 수 있는 코드가 아직 없어서 급한대로 업데이트 시 adapter를 새로 선언하고 데이터를 다시 전부 추가하는 방식으로 구현했습니다.
따라서 추후 이를 개선할 수 있는 방향으로 코드를 수정할 예정입니다.
Vote22는 구글 플레이스토어에서 ‘vote22’로 검색해서 다운받을 수 있습니다.