Ich habe die neueste kanarische Version von Android Studio installiert und folgte dieser Anweisung ( https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing ), um eine einfache zweiseitige Navigation zu implementieren. Grundsätzlich hat page1 eine Schaltfläche, und wenn auf diese geklickt wird, zeigt die App page2.
Es funktioniert, aber es gibt ein Problem ... Es scheint nichts mit der Aktionsleiste zu tun. Soll der Pfeil nach oben/hinten und das Attribut "Beschriftung" in der Aktionsleiste automatisch von der Navigationsbibliothek angezeigt werden? Oder soll ich die Arbeit wie zuvor manuell erledigen? Ich möchte den hinteren Pfeil und "Details" in der Aktionsleiste (Werkzeugleiste) anzeigen, wenn Seite2 angezeigt wird.
Klicken Sie auf die Schaltfläche auf Seite 1.
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
button1.setOnClickListener {
val nav = NavHostFragment.findNavController(this);
nav.navigate(R.id.show_page2)
}
}
Hauptaktivität XML. Standardmäßig war dies die Standard-Aktionsleiste. Ich habe sie durch eine Toolbar ersetzt. Es gab keinen Unterschied.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_height="?attr/actionBarSize"
Android:elevation="4dp"
Android:background="?attr/colorPrimary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Android:layout_width="match_parent">
</androidx.appcompat.widget.Toolbar>
<fragment
Android:id="@+id/my_nav_Host_fragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
Android:layout_width="0dp"
Android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:navGraph="@navigation/nav_graph"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Nav-Diagramm XML.
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/nav_graph"
app:startDestination="@id/page1">
<activity
Android:id="@+id/mainActivity2"
Android:name="com.Android.navtest.MainActivity"
Android:label="activity_main"
tools:layout="@layout/activity_main"/>
<fragment
Android:id="@+id/page1"
Android:name="com.Android.navtest.BlankFragment2"
Android:label="Home page"
tools:layout="@layout/page1">
<action
Android:id="@+id/show_page2"
app:destination="@id/page2"
app:enterAnim="@anim/anim1"
app:popExitAnim="@anim/anim2"/>
</fragment>
<fragment
Android:id="@+id/page2"
Android:name="com.Android.navtest.BlankFragment"
Android:label="Details"
tools:layout="@layout/page2"/>
</navigation>
Sie können Ihre ActionBar mit NavigationUI.setupActionBarWithNavController()
an einen NavController anschließen. Dies geschieht in der Regel in Ihrer Aktivität direkt nach dem Aufruf von setSupportActionBar()
:
supportActionBar = findViewById<Toolbar>(R.id.toolbar)
// Get the NavController for your NavHostFragment
val navController = findNavController(R.id.nav_Host_fragment)
// Set up the ActionBar to stay in sync with the NavController
setupActionBarWithNavController(navController)
Dieser Ansatz wird im Navigationsgespräch bei Google I/O 2018 behandelt.
Wenn Sie die Schaltfläche "Zurück zur Navigation" an mehreren Stellen verbergen möchten (standardmäßig nur für das Home-Fragment), können Sie der AppBarConfiguration IDs von Fragmenten hinzufügen und diese als zweiten Parameter von setupActionBarWithNavController übergeben.
val appBarConfiguration = AppBarConfiguration(setOf(R.id.splashFragment, R.id.onboardingFragment, R.id.homeFragment))
setupActionBarWithNavController(findNavController(R.id.nav_Host), appBarConfiguration)
das habe ich getan
private lateinit var appBarConfiguration: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityGameConfigBinding =
DataBindingUtil.setContentView(this, R.layout.activity_game_config)
supportActionBar?.show()
val navController = Navigation.findNavController(this, R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this, navController, null)
appBarConfiguration = AppBarConfiguration.Builder(navController.graph)
.build()
NavigationUI.setupWithNavController(binding.navView, navController)
}
override fun onSupportNavigateUp(): Boolean {
val navController = Navigation.findNavController(this, R.id.myNavHostFragment)
return NavigationUI.navigateUp(navController, appBarConfiguration)
}