web-dev-qa-db-ja.com

AppBarConfigurationでNavigationViewを設定する方法は?

私はナビゲーションの初心者です。ナビゲーションコンポーネントの開始宛先と最上位の宛先が同じではないため、AppBarConfigurationを使用してカスタムの最上位の宛先を使用しましたが、NavigationViewをnavControllerで設定したい場合NavigationUI.setupWithNavController(binding.navView, navController)を使用して、ドロワーアイテムでナビゲーションコンポーネントを設定しますが、ナビゲーションドロワーでアイテムを押して別のフラグメントに移動し、戻るボタンを押して、最高の目的地。それは私に開始の目的地を示していますが、カスタムのトップの目的地を表示したいのですが、これはそれらのメインアクティビティコードです。

import androidx.appcompat.app.AppCompatActivity
import Android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.drawerlayout.widget.DrawerLayout
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import com.example.Android.pass.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var drawerLayout: DrawerLayout
    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding
    private lateinit var navController: NavController
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setTheme(R.style.AppTheme)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        val toolbar= binding.toolbar
        drawerLayout = binding.drawerLayout
        navController = this.findNavController(R.id.myNavHostFragment)
        setSupportActionBar(toolbar)
        navController
            .addOnDestinationChangedListener { nc: NavController, nd: NavDestination, args: Bundle? ->
                if (nd.id == R.id.accountListFragment) {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
                } else {
                    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
                }
            }

        val topLevelDestinations = setOf(R.id.accountListFragment)
        appBarConfiguration = AppBarConfiguration.Builder(topLevelDestinations)
            .setDrawerLayout(drawerLayout)
            .build()
        NavigationUI.setupWithNavController(binding.navView, navController)
        NavigationUI.setupWithNavController(toolbar,navController,appBarConfiguration)
    }
    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController,appBarConfiguration)
    }
}

これは、ナビゲートしたいフラグメントを持つ同じIDの2つの項目を含む私の引き出しメニューです。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools">

    <item
        Android:id="@+id/aboutFragment"
        Android:icon="@drawable/question"
        Android:title="About" />
    <item
        Android:id="@+id/settingsFragment"
        Android:icon="@drawable/settings"
        Android:title="settings" />
</menu>
1
Amin Hosseini

次のコードを使用してnavigationViewnavControllerに設定する代わりに、答えを見つけました:NavigationUI.setupWithNavController(binding.navView, navController)メインアクティビティで次のコードを使用しました:

binding.navView.setNavigationItemSelectedListener(this)

override fun onNavigationItemSelected(item: MenuItem): Boolean {

    when (item.itemId) {
        R.id.about_item -> navController.navigate(R.id.aboutFramgent)
        R.id.settings_item -> navController.navigate(R.id.settingsFramgent)
    }

    return true
}

2
Amin Hosseini

これを使用:

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(navController.getGraph()).build();

:の代わりに

appBarConfiguration = AppBarConfiguration.Builder(topLevelDestinations)
1