onNavigationItemSelected не вызывается при выборе элемента - PullRequest
0 голосов
/ 05 февраля 2020

Я добавляю нижний колонтитул в навигационную панель, используя следующий код -

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nv_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|start">

        <androidx.core.widget.NestedScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <include layout="@layout/nav_header_main"/>

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/drawer_menu_body"
                    app:elevation="0dp"
                    android:layout_height="0dp"
                    android:layout_width="wrap_content"
                    android:layout_weight="1"
                    app:menu="@menu/activity_main_drawer">

                </com.google.android.material.navigation.NavigationView>

                <include layout="@layout/navigation_drawer_bottom_view"/>
            </LinearLayout>

        </androidx.core.widget.NestedScrollView>
    </com.google.android.material.navigation.NavigationView>


</androidx.drawerlayout.widget.DrawerLayout>

Но теперь onNavigationItemSelected () не вызывает, и навигационная панель остается открытой, пока мы не сдвинем ее вручную. Я использую навигационный компонент и навигационный график.

Side menu with footer view

Это мой код активности -

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)

    val navController = findNavController(R.id.nav_host_fragment)
    drawer_menu_body.setNavigationItemSelectedListener(this)
    nv_top.setNavigationItemSelectedListener(this)

    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_home,
            R.id.nav_gallery,
            R.id.nav_slideshow,
            R.id.nav_tools,
            R.id.nav_share,
            R.id.nav_send
        ), drawer_layout)


    setupActionBarWithNavController(navController, appBarConfiguration)
    drawer_menu_body.setupWithNavController(navController)
    nv_top.setupWithNavController(navController)
}

override fun onNavigationItemSelected(menu: MenuItem): Boolean {
    Log.d("testing_navigation","testing_navigation")
    drawer_layout.closeDrawer(GravityCompat.START)
    return true
}

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

Вы присоединяете setNavigationItemSelectedListener с помощью NavigationView, который будет переопределен во время конфигурации по умолчанию setupWithNavController. Так что присоедините ваш слушатель после настройки параметров по умолчанию. Проверьте код ниже.

nv_top.setupWithNavController(navController)
drawer_menu_body.setNavigationItemSelectedListener(this)

Обновление: Чтобы работать с навигацией по умолчанию, вы должны работать следующим образом:

override fun onNavigationItemSelected(menu: MenuItem): Boolean {
    val handled = NavigationUI.onNavDestinationSelected(menu, navController)

    if (!handled) {
        // handle other navigation other than default
    }

    drawer_layout.closeDrawer(GravityCompat.START)

    return handled
}
0 голосов
/ 26 марта 2020

Уважаемый, у меня сработал элемент R.id.nav_logout, мне нужно было завершить sh действие, а не экземпляр фрагмента:

private lateinit var appBarConfiguration: AppBarConfiguration
var drawerLayout: DrawerLayout? = null
var navView: NavigationView? = null
var navController: NavController? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_customer_main)
    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)

    val fab: FloatingActionButton = findViewById(R.id.fab)
    fab.setOnClickListener { view ->
        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
    }

    drawerLayout = findViewById(R.id.drawer_layout)
    navView = findViewById(R.id.nav_view)
    navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_home, R.id.nav_service_requests), drawerLayout)
    setupActionBarWithNavController(navController!!, appBarConfiguration)
    navView!!.setupWithNavController(navController!!)
    navView!!.setNavigationItemSelectedListener(this)
}

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}

override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
    menuItem.isChecked = true
    drawerLayout!!.closeDrawers()
    when (menuItem.itemId) {
        R.id.nav_logout -> {
            Prefs.putBoolean("flagLogin", false)
            val intent = Intent(this@CustomerMainActivity, LoginActivity::class.java)
            startActivity(intent)
            finish()
            return true
        }
    }
    if( navController!!.currentDestination!!.id != menuItem.itemId)
        navController!!.navigate(menuItem.itemId)
    return true
}
...