Navigation+Toolbar에 OptionsMenu를 표시하려면 setSupportActionBar의 위치를 주의하십시오.

개요


Jetpack의 Navigation 이야기입니다.
https://developer.android.com/guide/navigation
제목에서 보듯이 Navigation에서 Toolbar를 사용하여 Options Menu를 보낼 때 사소한 일로 걸려 넘어져서 남습니다.
탐색의 버전은 다음과 같습니다.
implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'

프로비저닝


MainActivity에는 Toolbar가 있습니다.
표시된 화면은 Fragment로 제작되었고 두 개의 화면이 있습니다.
첫 번째 프레임의 도구 모음에는 제목만 표시됩니다.
두 번째 프레임워크의 Toolbar는 내비게이션 제어와 OptionsMenu를 포함하고 첫 번째 프레임워크로 되돌아갑니다.
Toolbar의 설정은 Activity이고 OptionsMenu의 설정은 두 번째 Fragment에서 이루어집니다.


도구상자 설정


MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        setupToolbar()
    }

    private fun setupToolbar() {
        val navController = findNavController(R.id.nav_host_fragment)
        val toolbar = binding.toolbar

        // (1) OptionsMenuを出すために必要
        setSupportActionBar(toolbar)
        // (2) タイトル設定、Up navigateボタンのために必要
        toolbar.setupWithNavController(navController)
        // (2)はこちらの書き方でもOK
        // NavigationUI.setupWithNavController(toolbar, navController)
    }
}
위에서 말한 바와 같이 Activity에 Toolbar를 설정하면 기대하는 행동이 있습니다.

OptionsMenu가 나타나지 않습니다.


private fun setupToolbar() {
        val navController = findNavController(R.id.nav_host_fragment)
        val toolbar = binding.toolbar

        // (2) タイトル設定、Up navigateボタンのために必要
        toolbar.setupWithNavController(navController)
        // (2)はこちらの書き方でもOK
        // NavigationUI.setupWithNavController(toolbar, navController)
    }
setSupport ActionBar(toolbar)라고 부르지 않으면 OptionsMenu가 나오지 않습니다.

잘못된 위쪽 탐색 버튼


private fun setupToolbar() {
        val navController = findNavController(R.id.nav_host_fragment)
        val toolbar = binding.toolbar

        // (2) タイトル設定、Up navigateボタンのために必要
        toolbar.setupWithNavController(navController)
        // (2)はこちらの書き方でもOK
        // NavigationUI.setupWithNavController(toolbar, navController)

        // (1) OptionsMenuを出すために必要
        setSupportActionBar(toolbar)
    }
이렇게 하면 setupWithNavController 다음에 setSupportActionBar (toolbar) 를 설정하면 Up 단추가 표시될 때 무효입니다.
또한 Toolbar를 사용할 때 Navigation은 내비게이션 단추의 이벤트를 자동으로 처리하기 때문에 onSupportNavigateUp()을 덮어쓸 필요가 없습니다.

예제 코드


아래에 코드가 있습니다.
https://github.com/iiinaiii/UI-Samples/blob/master/app/src/main/java/com/iiinaiii/uisamples/ui/MainActivity.kt

좋은 웹페이지 즐겨찾기