Android Studioの最新のカナリアバージョンをインストールし、これに従いました( https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing )単純な2ページのナビゲーションを実装する命令基本的にpage1にはボタンがあり、クリックするとアプリにpage2が表示されます。
それは機能しますが、1つの問題があります...アクションバーで自動的に何もしないようです。ナビゲーションライブラリによってアクションバーに上/戻る矢印と「ラベル」属性が自動的に表示されることになっていますか?または、以前のようにすべての作業を手動で行うことになっていますか? page2が表示されているときに、アクション(ツール)バーに戻る矢印と「詳細」を表示したい。
ページ1のボタンをクリックします。
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
button1.setOnClickListener {
val nav = NavHostFragment.findNavController(this);
nav.navigate(R.id.show_page2)
}
}
メインアクティビティXML。デフォルトではデフォルトのアクションバーでしたが、ツールバーに置き換えました。違いはありませんでした。
<?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>
ナビゲーショングラフ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>
NavigationUI.setupActionBarWithNavController()
を使用して、ActionBarをNavControllerに接続できます。これは通常、アクティビティで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)
このアプローチは Google I/O 2018でのナビゲーショントーク で説明されています。
複数の場所でナビゲーションの戻るボタンを非表示にする場合(デフォルトはホームフラグメントのみ)、フラグメントのIDをAppBarConfigurationに追加し、これをsetupActionBarWithNavControllerの2番目のパラメーターとして渡すことができます。次に例を示します。
val appBarConfiguration = AppBarConfiguration(setOf(R.id.splashFragment, R.id.onboardingFragment, R.id.homeFragment))
setupActionBarWithNavController(findNavController(R.id.nav_Host), appBarConfiguration)
これは私がやったことです
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)
}