코드를 몇 줄 쓰지도 않았는데 setContentView가 안 되는 경우가 있다.
manifest에 등록도 똑바로 했고, xml 렌더링에 문제가 없는데도 문제가 생긴다면 올바른 onCreate 의 super를 호출했는지 확인해봐야 한다.
Activity에 AppCompatActivity를 상속받은 후, Android 자동완성 기능을 이용해 탭 하면 선택되는 것은 onCreate(Bundle, PersistableBundle)이지만, setContentView를 호출할 수 있는 것은 onCreate(Bundle)이다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root) // 작동함
}
override fun onCreate(savedInstanceState: Bundle?, persistableBundle: PersistableBundle?) {
super.onCreate(savedInstanceState, persistableBundle)
setContentView(binding.root) // 작동안함
}
둘이 왜 차이가 나는지 F4를 누르면 쉽게 확인할 수 있다.
super.onCreate(savedInstanceState)는 아래와 같은 내용을 담고 있다.
/**
* {@inheritDoc}
*
* Perform initialization of all fragments.
*/
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
mFragments.dispatchCreate();
}
LifeCycle에 관련된 이벤트를 처리하는 함수를 호출해서 Activity 및 Fragment의 create 관련 콜백이 실행된다.
반면 super.onCreate(savedInstanceState, persistentState) 에는 아무 내용이 없다.
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
throw new RuntimeException("Stub!");
}
AppCompatActivity와 Activity 사이에 수많은 클래스들이 있는데, 그 어디서도 이 함수를 구현하지 않았다.
아무 일도 하지 않으니 setContentView가 작동할리가 없다.
아마 커스텀 작업을 하고 싶은 사람들을 위해 메서드를 빈 채로 만들어 놓은 것이 아닐까 싶다.
다만 PersistableBundle은 재부팅 후 다시 앱 데이터를 복원하는 데 사용할 수 있다고 하니, 평소에는 onCreate(Bundle)을 쓰다가 PersistableBundle이 필요할 때만 아래와 같이 쓰는 게 좋지 않을까 생각한다.
override fun onCreate(savedInstanceState: Bundle?, persistableBundle: PersistableBundle?) {
super.onCreate(savedInstanceState)
binding = 뷰바인딩.inflate(LayoutInflater.from(this))
setContentView(binding.root)
// persistableBundle 사용
}
'프레임워크 > Android' 카테고리의 다른 글
CoordinatorLayout에서 겹쳐진 뷰의 터치 이벤트를 처리하는 방식 (0) | 2022.12.01 |
---|---|
Databinding Type mismatch 문제 : layout format 확인하기 (0) | 2022.11.30 |
Jetpack Navigation Safeargs 사용법 (0) | 2022.11.29 |
RecyclerView 요약정리 (0) | 2022.11.03 |
Hilt 간단한 예제 (0) | 2022.10.27 |