wake-up-neo.com

Navigationskomponente, steuern, wann das Symbol für Hamburger oder zurück angezeigt werden soll

Ich habe die folgende Aktivität

class MainActivity : AppCompatActivity() {

private lateinit var drawerLayout: androidx.drawerlayout.widget.DrawerLayout

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

    drawerLayout = drawer_layout

    val navController = Navigation.findNavController(this, R.id.fragment_main_navHost)

    setSupportActionBar(toolbar)

    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
    navView_main.setupWithNavController(navController)
}

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(drawerLayout,
        Navigation.findNavController(this, R.id.fragment_main_navHost))
}

override fun onBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START)
    } else {
        super.onBackPressed()
    }
}

was, wie Sie sehen können, mit der Navigationsgrafik verknüpft ist und ich eine Navigationsleiste verwende. Wenn ich durch die Elemente in der Schublade navigiere, möchte ich das Hamburger-Symbol beibehalten und es nur in die Aufwärts-/Zurück-Schaltfläche ändern, wenn ich beispielsweise auf ein Element im Fragment oder Popup klicke und sicherstellen, dass das Verhalten des Systems das widerspiegelt Der Benutzer erwartet, basierend auf dem angezeigten Symbol. Ist das möglich 

8
Mustafa ALMulla

Um zu steuern, wann die AppBar-Navigation nach oben/hinten zeigt, müssen die folgenden Schritte ausgeführt werden 

1- Erstellen Sie AppBarConfiguration und übergeben Sie das Ziel der obersten Ebene und das drawerLayout

    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.dest_one,
            R.id.dest_two
        ),
        drawerLayout
    )

2- Informieren Sie die AppBar über die Konfiguration und die Navigation. Auf diese Weise können Sie einen Titel und ein Pfeil- oder Schubladenmenüsymbol anzeigen

setupActionBarWithNavController(navController, appBarConfig)

3- Überschreiben Sie schließlich onOptionsItemSelected und onSupportNavigateUp sowie die Erweiterung für die Navigationskomponente, um die AppBar über das Verhalten zu informieren 

    override fun onOptionsItemSelected(item: MenuItem)= item.onNavDestinationSelected(findNavController(R.id.my_nav_Host_fragment))
        || super.onOptionsItemSelected(item)


override fun onSupportNavigateUp() = findNavController(R.id.my_nav_Host_fragment).navigateUp(appBarConfiguration)

Referenzhandbuch für Google Code Lab Navigation Codelab

2
Mustafa ALMulla

Folge diesen Schritten

1. Binden Sie Ihre NavigationView mit NavigationUI

NavigationUI.setupWithNavController(nav_view, hostFragment.navController)

2. Bind ActionBar mit NavController

NavigationUI.setupActionBarWithNavController([email protected], hostFragment.navController)

3. binden ActionBar und DrawerLayout mit NavController

NavigationUI.setupActionBarWithNavController([email protected], hostFragment.navController, drawer_layout)

4. überschreibt onSupportNavigateUp() in Ihrer Aktivität 

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(drawer_layout, hostFragment.navController) 
              || super.onSupportNavigateUp()
}

Probe:

class NavActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    lateinit var hostFragment: NavHostFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_nav)
        setSupportActionBar(toolbar)

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }

        val toggle = ActionBarDrawerToggle(
                this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()

        nav_view.setNavigationItemSelectedListener(this)

        hostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_Host_fragment) as NavHostFragment    
        NavigationUI.setupWithNavController(nav_view, hostFragment.navController)    
        NavigationUI.setupActionBarWithNavController([email protected], hostFragment.navController)    
        NavigationUI.setupActionBarWithNavController([email protected], hostFragment.navController, drawer_layout)    
    }

    override fun onBackPressed() {
        if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
            drawer_layout.closeDrawer(GravityCompat.START)
        } else {
            super.onBackPressed()
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(drawer_layout, hostFragment.navController) || super.onSupportNavigateUp()
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.nav, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        when (item.itemId) {
            R.id.action_settings -> return true
            else -> return super.onOptionsItemSelected(item)
        }
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        // Handle navigation view item clicks here.
        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }
}

Ausgabe

Heimatfragment:

Home Fragment

Fragment zwei:

Fragment Two

Fragmentbaum:

Fragment Tree

4
Nilesh Rathod

Ich denke also, dass Sie den NavController.OnNavigatedListener verwenden können, um zu hören, welches Fragment angezeigt wird, und dann das Symbol der Symbolleiste zu aktualisieren.

val navController = Navigation.findNavController(this, R.id.fragment_main_navHost)
navController.addOnNavigatedListener(contoller, destination -> {
   if(destination.id == R.id.fragmentTwo){
          // change the toolbar icon here
}
    })

Entschuldigung, ich habe keinen Computer hier, also schreibe ich diesen Code ohne eine IDE, dies kann einen Fehler haben. Aber nimm die Idee.

Hoffe das hilft dir.

0
Pedro Massango