从之前的版本更新到 Navigation 2.2.0-beta01 后,lint 会发出有关将
<fragment>
标签替换为 FragmentContainerView
的警告。
但是,单独替换标签似乎可以防止导航图膨胀。
FragmentContainerView
在内部使用。我们应该忽略 lint 警告吗?
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Lint warning: "Replace the <fragment> tag with FragmentContainerView. -->
<fragment
android:id="@+id/nav_host_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph_main"/>
<!-- other elements -->
</androidx.constraintlayout.widget.ConstraintLayout>
仍然存在一个错误,如果您简单地将 fragment 替换为
val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
重要!不同版本的
FragmentContainerView
存在已知问题。使用前请参阅变更日志。通读错误修复并使用最新版本的库。
目前,您还应该声明对 Fragment 1.2.0-beta02 的依赖,因为它包含针对此用例的修复。
implementation "androidx.fragment:fragment:1.2.0-beta02"
版本1.2.0-beta02
2019 年 10 月 11 日
错误修复
修复了 Fragment 的
未从onInflate()
接收到正确属性的问题,破坏了FragmentContainerView
等情况。 (b/142421837)NavHostFragment
来源:https://developer.android.com/jetpack/androidx/releases/fragment#1.2.0-beta02
NavigationBasicSample 已更新至 2.2.0-alpha01,但仍使用
fragment
标签。 NavigationAdvancedSample 显示了 FragmentContainerView
的使用,但导航图在代码中被夸大了(它们有几个不同的图),并且相应的主机片段被添加到 FragmentContainerView
中。所以我想说,如果我们想要自动通胀,此时我们应该忽略该警告。
使用Java
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment);
navController = navHostFragment.getNavController();
我使用 AGP 8.4 kotlin 1.9.22
我通过这些步骤解决了这个问题
toml版本目录
[versions]
navVersion = "2.7.7"
[libraries]
navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navVersion" }
navigation-dynamic-features-fragment = { module = "androidx.navigation:navigation-dynamic-features-fragment", version.ref = "navVersion" }
navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navVersion" }
navigation-fragment-ktx = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "navVersion" }
navigation-ui-ktx = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "navVersion" }
gradle 应用程序级别
// change ktx when your activity or fragment using kotlin
implementation libs.navigation.fragment // .ktx
implementation libs.navigation.ui // .ktx
implementation libs.navigation.dynamic.features.fragment
在
MainActivity
// imports
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
// onCreate
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment_activity_main); // change to your xml nav
NavController navController = navHostFragment.getNavController();