Simple&Natural

[Android] Navigation Component 사용시 각 Fragment Toolbar의 뒤로가기 버튼 없애기 본문

안드로이드(Android)/기타

[Android] Navigation Component 사용시 각 Fragment Toolbar의 뒤로가기 버튼 없애기

Essense 2020. 10. 10. 21:20
728x90

Navigation Component 는 기본적으로 최상위 목적지가 아닌 지점에서는 뒤로가기 버튼을 생성한다.

이를 해결하기 위한 방법은 간단하다.

AppBarConfiguration에 각 Fragment를 최상위 지점으로 설정하는 것이다.

 

MainActivity에서 Configuration을 지정하고

사용하고자 하는 각 Fragment에서 해당 Config을 불러와 Toolbar를 초기화하면 된다.

 

이때, MainActivity가 아니라 Fragment에서 초기화를 시켜주는 이유는 각 Fragment별로 다른 유형의 Toolbar를

사용하고자 하기 때문이다. 다음 공식문서의 설명을 참고하면 된다.

 


Support app bar variations

Adding the top app bar to your activity works well when the app bar’s layout is similar for each destination in your app. If, however, your top app bar changes substantially across destinations, then consider removing the top app bar from your activity and defining it in each destination fragment, instead.


The navigation configuration logic is the same for both of these fragments, except that you should call setupWithNavController() from within each fragment's onViewCreated() method, instead of initializing them from the activity:

 

출처: developer.android.com/guide/navigation/navigation-ui#appbarconfiguration


 

 

MainActivity.class

appBarConfiguration 지정 시 인자로 destinationIds와 같이 최상위 레이아웃의 id를 직접 넣어도 되지만

아래처럼 bottomNavigationView의 Menu를 인자로 넣어주면 좀 더 편리하다. 

class MainActivity : BaseActivity() {
    lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        val navController = navHostFragment.navController
        val destinationIds = setOf(
            R.id.Home,
            R.id.Notification,
            R.id.News,
            R.id.Setting
        )
        appBarConfiguration = AppBarConfiguration(bottom_nav.menu)
//        val appBarConfiguration = AppBarConfiguration(navController.graph)
//        toolbar
//            .setupWithNavController(navController, appBarConfiguration)
        bottom_nav
            .setupWithNavController(navController)
    }

}

 

 

fragment의 onViewCreated 안에서 activity의 appConfig을 받아와 초기화 해준다.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val navController = findNavController()
        val appBarConfiguration = (activity as MainActivity).appBarConfiguration

        view.findViewById<Toolbar>(R.id.toolbar_home)
            .setupWithNavController(navController, appBarConfiguration)

    }
728x90