アプリでの移動にNavigation Componentを使用しています。フラグメント内では正常に動作しますが、実際のナビゲーションホストを保持するアクティビティでナビゲーションホストを見つけることができません。
ユーザーがFABをクリックしたときに新しいフラグメントを開こうとしています。これは、メインアクティビティのXMLに含めました。 findNavController()を呼び出すと、コントローラーが見つかりません。 nav HostコントローラーはXMLレイアウトにあります。なぜそれが見つからないのか理解できません。
主な活動
class MainActivity : AppCompatActivity(), OnActivityComponentRequest {
override fun getTabLayout(): TabLayout {
return this.tabLayout
}
override fun getFap(): FloatingActionButton {
return this.floatingActionButton
}
private lateinit var tabLayout: TabLayout
private lateinit var floatingActionButton: FloatingActionButton
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
this.tabLayout = tabs
this.floatingActionButton = fab
fab.setOnClickListener {
it.findNavController().navigate(R.id.addNewWorkoutFragment)
}
}
}
アクティビティのメインXML
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
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=".domain.MainActivity"
Android:animateLayoutChanges="true">
<com.google.Android.material.appbar.AppBarLayout
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<com.google.Android.material.tabs.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<com.google.Android.material.tabs.TabItem
Android:text="Test 1"
Android:layout_height="match_parent"
Android:layout_width="match_parent"/>
<com.google.Android.material.tabs.TabItem
Android:text="Test 2"
Android:layout_height="match_parent"
Android:layout_width="match_parent"/>
</com.google.Android.material.tabs.TabLayout>
</com.google.Android.material.appbar.AppBarLayout>
<fragment
Android:id="@+id/nav_Host_fragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/main_navigation" />
<com.google.Android.material.bottomappbar.BottomAppBar
Android:id="@+id/bar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"/>
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:layout_anchorGravity="right|top"
app:layout_anchor="@+id/bar"
Android:src="@drawable/ic_add_black_24dp"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
問題は、FABがアクティビティに追加されたか、NavHostフラグメントで使用されているものとは異なるフラグメントに追加された可能性があります。この場合、it.findNavController()
を呼び出すと、ナビゲーションコントローラーが見つかりません。
FABがNavHostによってプルされたフラグメントに属していることを確認するか、アクティビティのfindNavController(<id>)
を呼び出して、検索しているフラグメントのIDを渡すことができます
override fun onCreate(savedInstanceState: Bundle?) {
...
fab.setOnClickListener {
findNavController(R.id.nav_Host_fragment)
.navigate(R.id.R.id.addNewWorkoutFragment)
}
}