如何将 NavHostFragment 与 FragmentContainerView 一起使用?
How to use NavHostFragment with FragmentContainerView?
我很好奇我在使用导航组件时遇到的问题,特别是在托管 NavHostFragment
方面。我有一个带有几个片段的单一 Activity 本机应用程序。我在启动器的 xml 中,将 <fragment>
替换为 <androidx.fragment.app.FragmentContainerView>
。
初步实施已按预期运行了一年。在本周介绍 FragmentContainerView 时,起始目的地的屏幕不会在启动时呈现。然而,我观察到证明从网络和缓存传入的数据成功的日志。从此状态开始,仅通过旋转设备触发配置更改会按预期呈现 UI。
我的 AndroidX NavigationFragmentKtx 和 NavigationUiKtx 依赖项是版本 2.3.2
。相关文件略。有什么突出的我错过了吗?任何想法表示赞赏。
launcher_activity.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/launcher_navHost"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
LauncherActivity.kt
class LauncherActivity : AppCompatActivity(R.layout.launcher_activity) {
private lateinit var viewBinding: LauncherActivityBinding
private val navController: NavController by lazy {
val navHost = supportFragmentManager.findFragmentById(
R.id.launcher_navHost
) as NavHostFragment
navHost.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = LauncherActivityBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
}
}
您正在使用 AppCompatActivity(R.layout.launcher_activity)
,这意味着您将自动调用 setContentView(R.layout.launcher_activity)
作为 super.onCreate(savedInstanceState)
的一部分(这就是传递布局 ID 的作用)。然后,您将通过第二次调用 setContentView()
.
来覆盖该布局
如果您正在使用视图绑定,则可以删除 R.layout.launcher_activity
部分,因为不需要它(也是问题的根源):
class LauncherActivity : AppCompatActivity() {
我很好奇我在使用导航组件时遇到的问题,特别是在托管 NavHostFragment
方面。我有一个带有几个片段的单一 Activity 本机应用程序。我在启动器的 xml 中,将 <fragment>
替换为 <androidx.fragment.app.FragmentContainerView>
。
初步实施已按预期运行了一年。在本周介绍 FragmentContainerView 时,起始目的地的屏幕不会在启动时呈现。然而,我观察到证明从网络和缓存传入的数据成功的日志。从此状态开始,仅通过旋转设备触发配置更改会按预期呈现 UI。
我的 AndroidX NavigationFragmentKtx 和 NavigationUiKtx 依赖项是版本 2.3.2
。相关文件略。有什么突出的我错过了吗?任何想法表示赞赏。
launcher_activity.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/launcher_navHost"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
LauncherActivity.kt
class LauncherActivity : AppCompatActivity(R.layout.launcher_activity) {
private lateinit var viewBinding: LauncherActivityBinding
private val navController: NavController by lazy {
val navHost = supportFragmentManager.findFragmentById(
R.id.launcher_navHost
) as NavHostFragment
navHost.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = LauncherActivityBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
}
}
您正在使用 AppCompatActivity(R.layout.launcher_activity)
,这意味着您将自动调用 setContentView(R.layout.launcher_activity)
作为 super.onCreate(savedInstanceState)
的一部分(这就是传递布局 ID 的作用)。然后,您将通过第二次调用 setContentView()
.
如果您正在使用视图绑定,则可以删除 R.layout.launcher_activity
部分,因为不需要它(也是问题的根源):
class LauncherActivity : AppCompatActivity() {