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()