Problem
- Navigation Architecture Componentを使ってActionBarをセットアップした場合は、Fragmentの
onCreateView
イベントより後でsupportActionBar?setHomeAsUpIndicator
を呼び出さないと、アイコンを変更できないようです。
Solution
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val navController get() = NavHostFragment.findNavController(nav_host_fragment)
private val topLevelDestinationIds = setOf(R.id.homeFragment)
// ...
fun onFragmentViewCreated() {
setHomeIcon(R.drawable.ic_custom_back)
}
private fun setHomeIcon(resourceID: Int) {
val destinationID = navController.currentDestination?.id ?: return
val isTopLevelDestination = (destinationID in topLevelDestinationIds)
supportActionBar?.setDisplayHomeAsUpEnabled(isTopLevelDestination.not())
supportActionBar?.setHomeAsUpIndicator(if (isTopLevelDestination) 0 else resourceID)
}
}
BaseFragment.kt
abstract class BaseFragment : Fragment() {
private val mainActivity: MainActivity? get() = (activity as? MainActivity)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mainActivity?.onFragmentViewCreated()
}
}