Навигация снизу с макетом ящика в одном приложении - проблема со значком вверх - PullRequest
0 голосов
/ 02 апреля 2020

Я начинающий разработчик для android, и мне довольно сложно создать следующее приложение.

Я хотел бы создать приложение, которое может использовать как Bottom Navigation View, так и Layer Layout. Мне удалось это сделать, потому что оба эти элемента работают правильно (я использую утилиту NavigatioUI). Моя проблема связана с кнопкой вверх. Когда я изменяю фрагмент после нажатия на элемент в одном из двух видов навигации, кнопка вверх превращается в стрелку назад, поэтому, если я щелкаю по нему, я возвращаюсь к фрагменту по умолчанию. Я хочу иметь возможность открывать меню Drawer из каждого фрагмента, но не могу! Кто-нибудь может мне помочь, пожалуйста! спасибо!

Вот MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //setto la toolbar come Action Bar
        setSupportActionBar(toolbar2)


        //inizializzo gli elementi di navigation
        setupNavigation()
    }

    /*
    settaggio degli elementi di Navigation.
    Il NavigationUI recupera l'ID selezionato col bottone e lo collega al fragment dentro il mobile_navigation
    */
    private fun setupNavigation() {

        //per usare la libreria Navigation per viaggiare tra i vari fragment serve un Navigation Controller
        val navController = Navigation.findNavController(this, R.id.nav_host_fragment2)

        //settaggio Toolbar per avere il bottone a sinistra (drawer layout)
        NavigationUI.setupActionBarWithNavController(this, navController, drawer_layout2)

        //settaggio del Bottom Navigation
        bottom_nav2?.let {
            NavigationUI.setupWithNavController(it, navController)
        }

        //settaggio del Drawer Layout
        nav_view2?.let {
            NavigationUI.setupWithNavController(it, navController)
        }

    }

    //popola la Toolbar con i suoi item menu
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_toolbar, menu)
        return true
    }

    //funzione per gestire il click sugli elementi della toolbar presi dal menu
    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        val navController = Navigation.findNavController(this, R.id.nav_host_fragment2)
        val navigated = NavigationUI.onNavDestinationSelected(item!!, navController)
        return navigated || super.onOptionsItemSelected(item)
    }

    //questa funzione consente di attivare il click sull'icona in alto a sinistra qualunque sia
    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.nav_host_fragment2), drawer_layout2)
    }
}

Вот Activity_main. xml

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?colorPrimary" />

        <fragment
            android:id="@+id/nav_host_fragment2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/mobile_navigation"
            app:defaultNavHost="true" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/bottom_nav2"
            app:menu="@menu/menu_navigation"/>

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view2"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/menu_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

1 Ответ

0 голосов
/ 03 апреля 2020

Я наконец нашел ответ. Ссылаясь на код моего вопроса, мне нужно было объявить следующую переменную и настроить с ней панель действий (вы можете объявить первый lateinit var для navController и appBarConfiguration перед функцией onCreate, чтобы использовать следующий код)

//id dei fragment dove voglio vedere l'icona del menu e non la back arrow
val appBarConfiguration : AppBarConfiguration = AppBarConfiguration(setOf(
            R.id.destination_home, R.id.destination_camera, R.id.destination_photos, 
            R.id.destination_altro), drawer_layout2)

setupActionBarWithNavController(navController, appBarConfiguration)

Затем мне нужно было изменить функции onOptionsItemSelected и onSupportNavigateUp следующим образом

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        return item!!.onNavDestinationSelected(navController) || 
                super.onOptionsItemSelected(item)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp(appBarConfiguration)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...