프레임워크/Android

setContentView 안될 때 - onCreate 체크

Julie825 2022. 10. 4. 22:40

코드를 몇 줄 쓰지도 않았는데 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 사용
    }