将 FragmentContainerView 与导航组件一起使用?

问题描述 投票:0回答:5

从之前的版本更新到 Navigation 2.2.0-beta01 后,lint 会发出有关将

<fragment>
标签替换为
FragmentContainerView
的警告。

但是,单独替换标签似乎可以防止导航图膨胀。

根据2.2.0-alpha01

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>
android android-layout
5个回答
46
投票

仍然存在一个错误,如果您简单地将 fragment 替换为 ,则会引发异常。截至目前,正如许多谷歌工程师在此bug线程中所述,修复方法是更改您的活动中的代码:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

21
投票

重要!不同版本的

FragmentContainerView
存在已知问题。使用前请参阅变更日志。通读错误修复并使用最新版本的库。


目前,您还应该声明对 Fragment 1.2.0-beta02 的依赖,因为它包含针对此用例的修复。

implementation "androidx.fragment:fragment:1.2.0-beta02"

版本1.2.0-beta02

2019 年 10 月 11 日

错误修复

修复了 Fragment 的

onInflate()
未从
FragmentContainerView
接收到正确属性的问题,破坏了
NavHostFragment
等情况。 (b/142421837)

来源:https://developer.android.com/jetpack/androidx/releases/fragment#1.2.0-beta02


15
投票

NavigationBasicSample 已更新至 2.2.0-alpha01,但仍使用

fragment
标签。 NavigationAdvancedSample 显示了
FragmentContainerView
的使用,但导航图在代码中被夸大了(它们有几个不同的图),并且相应的主机片段被添加到
FragmentContainerView
中。所以我想说,如果我们想要自动通胀,此时我们应该忽略该警告。


5
投票

使用Java

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
                .findFragmentById(R.id.nav_host_fragment);
navController = navHostFragment.getNavController();

0
投票

我使用 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();
© www.soinside.com 2019 - 2024. All rights reserved.