[Android] Activity에서 transaction된 Fragment에 접근하기 위해 사용한 findFragmentById()가 null을 리턴하는 이유

thsamajiki·2024년 4월 27일
1

트러블슈팅

목록 보기
25/25

문제 및 원인

activity에서 fragment의 함수를 호출하기 위해 findFragmentById(R.id.fragmentId)를 호출했는데 null을 리턴해서 당황했다.

기존의 코드는 다음과 같다.

val intent = OneFragment.newInstance()
val transaction = supportFragmentManager.beginTransaction()

transaction.replace(R.id.frameLayout, intent).commit()

if (supportFragmentManager.findFragmentById(R.id.frameLayout) is OneFragment) {
	// todo
}
                        
Log.d("Log", "findFragmentById: ${supportFragmentManager.findFragmentById(R.id.frameLayout)}")

이러한 오류가 발생한 원인을 알기 위해서는 Fragment의 트랜잭션에 대해서 알아야 한다.

fragmentManager의 beginTransaction()을 한 후에 commit()을 하면 트랜잭션은 비동기로 실행된다. 그래서 Activity에 attach 되는 것은 잠시 후에 이루어지고, 그래서 context를 사용할 수 있는 것도 잠시 후에 이루어진다.
따라서 fragment를 바로 부르지를 못하니 null이 리턴되는 것이다.



해결책

transaction.commit() 후에 fragmentManager.executePendingTransactions() 명령을 꼭 넣어줘야 한다.

supportFragmentManager.executePendingTransactions()

이때부터 findFragmentById가 정상적으로 OneFragment를 리턴했다.


val intent = OneFragment.newInstance()
val transaction = supportFragmentManager.beginTransaction()

transaction.replace(R.id.frameLayout, intent).commit()

supportFragmentManager.executePendingTransactions()
profile
안드로이드 개발자

0개의 댓글