当前位置: 首页 > 知识库问答 >
问题:

如何使用底部导航视图和Android导航组件将参数传递给片段?

范瀚昂
2023-03-14

是否可以使用底部导航视图和导航组件传递和访问片段中的参数?

我使用一个活动包含多个片段的方法,其中我的顶层片段需要一个参数(通常通过newInstance生成的方法完成)。我看过导航组件开发者指南和codelab,但是它只提到了使用safeargs和在目的地和动作中添加参数标签。

这是我的导航图:

<navigation xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" 
    app:startDestination="@id/homeFragment">

    <fragment android:id="@+id/homeFragment"
          android:name="uk.co.homeready.homeready.HomeFragment"
          android:label="fragment_home"
          tools:layout="@layout/fragment_home">
          <!--Do I create an argument block here?-->
    </fragment>

    <fragment android:id="@+id/calculatorFragment"
          android:name="uk.co.homeready.homeready.CalculatorFragment"
          android:label="fragment_calculator"
          tools:layout="@layout/fragment_calculator"/>

    <fragment android:id="@+id/resourcesFragment"
          android:name="uk.co.homeready.homeready.ResourcesFragment"
          android:label="fragment_resources"
          tools:layout="@layout/fragment_resources"/>

</navigation>

底部导航视图菜单:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/homeFragment"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home"/>

    <item
        android:id="@+id/calculatorFragment"
        android:icon="@drawable/ic_baseline_attach_money_24px"
        android:title="@string/title_calculator"/>

    <item
        android:id="@+id/resourcesFragment"
        android:icon="@drawable/ic_baseline_library_books_24px"
        android:title="@string/title_resources"/>

</menu>

主要活动:

override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val navController = Navigation.findNavController(this, 
        R.id.nav_host_fragment)
        bottom_navigation.setupWithNavController(navController)
        ....
}

activity_main.xml

<android.support.constraint.ConstraintLayout>
    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:layout_constraintBottom_toTopOf="@id/bottom_navigation"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph"/>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        app:menu="@menu/bottom_navigation"/>

</android.support.constraint.ConstraintLayout>

家庭碎片

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val argument = //TODO access argument here
    ...
}

共有3个答案

臧威
2023-03-14

默认值对我来说是不可用的,因为我有动态菜单项,这些菜单项可以有多个具有不同参数的相同目标。(从服务器更改)

实施BottomNavigationView.OnNavigationItemSelectedListener:

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val fragmentId = item.itemId
    val arguments = argumentsByFragmentId[fragmentId] // custom mutableMapOf<Int, Bundle?>() with arguments
    navController().navigate(fragmentId, arguments)
    return true
}

要使用它,您将通过替换侦听器来接管导航。这里的调用顺序很重要:

bottomNavigationView.setupWithNavController(navController)
bottomNavigationView.setOnNavigationItemSelectedListener(this)
上官斌
2023-03-14

正确的方法确实是使用

<fragment android:id="@+id/homeFragment"
      android:name="uk.co.homeready.homeready.HomeFragment"
      android:label="fragment_home"
      tools:layout="@layout/fragment_home">
      <argument
          android:name="Argument"
          android:defaultValue="value"
          />
</fragment>

这将自动用默认值填充片段的参数,而不需要任何额外的代码。从导航1.0.0-alpha09开始,无论你是否使用安全的Args Gradle插件都是如此。

司寇灵均
2023-03-14

如果我理解正确,您希望将参数传递给与菜单项绑定的目标。尝试在您的活动onCreate方法中使用“OnDestinationChangedListener”,如下所示:

navController.addOnDestinationChangedListener { controller, destination, arguments ->
        when(destination.id) {
            R.id.homeFragment -> {
                val argument = NavArgument.Builder().setDefaultValue(6).build()
                destination.addArgument("Argument", argument)
            }
        }
    }

更新:

如果您希望您的起始目标将收到默认参数,则实现应该有所不同。首先,从您的“NavHostFraank”xml标签中删除“app: navGraph=”@导航/nav_graph”。

然后,在创建活动中,您需要放大图表:

 val navInflater = navController.navInflater
 val graph = navInflater.inflate(R.navigation.nav_graph)

然后将您的参数添加到图形(此参数将附加到起始目标)

val navArgument1=NavArgument.Builder().setDefaultValue(1).build()           
val navArgument2=NavArgument.Builder().setDefaultValue("Hello").build()
graph.addArgument("Key1",navArgument1)
graph.addArgument("Key2",navArgument2)

然后将图形附加到NavController:

navController.graph=graph

现在,您的第一个目标应接收附加的参数。

 类似资料:
  • 我有3个项目的底部导航视图,我的如下所示: 底部导航视图中带有嵌套navGraph片段的导航工作正常,但是如果我导航到,它在嵌套navGraph之外,并且我单击其他项目/片段,我无法导航到其他片段,我基本上被困在这个屏幕上。 我检查了一下,如果我把

  • 我已经创建了导航抽屉活动,作为导航抽屉活动的更新新格式,根据新的Android架构,我用导航组件结构得到了它。 带有和的代码位于下方,当我单击任何导航项时,它正在打开片段。 这适用于nav\u host\u片段: 导航正在使用此 现在我想在调用时将一些值作为一个束(参数)在片段中传递。 场景:我有两个片段,分别是PrivacyPolicyFragment和TermsConditionsFragme

  • 我有如下的屏幕,其中包含一个导航抽屉和底部导航在同一个屏幕上: 我正在使用Jetpack导航架构组件。 当前问题和我尝试了什么? 单击第二个和第三个底部导航项目会在工具栏上显示返回箭头吗? 已尝试:将与第二和第三底部导航相关联的片段设置为顶级目的地 代替 不起作用。 任何帮助高度赞赏! 我的代码如下所示。 activity_main.xml menu_bottom.xml nav_graph.xm

  • 我正在将我的应用程序转换为使用一个活动并添加了BottomNavigationView,并努力防止在片段之间导航时重新创建片段,进行不必要的api调用。但是我无法使它工作: 不显示片段 图标未切换 触摸底部菜单项不会切换片段 触摸所选项目会使应用崩溃,并带有 TypeCastException: 活动的布局: 底部导航菜单: 在主活动中: 导航扩展: 屏幕为空白,未呈现任何片段视图。 有人能帮我解

  • 我的应用程序有问题。我有一个底部导航视图,包含3个不同的片段,尽管目前只有主要的内容。当我试图从左侧的两个片段中的一个移动到主视图时,问题就出现了,即当底部导航视图被隐藏时。我附上了主代码。 PD:我有25.3.1版本的所有库(如果有用的话)。 感谢您的关注。 activity\u main。xml 主要活动。Java语言 我也给你添加了两张图片。 Ofertas片段 主片段

  • 但是,当我初始化BottomNavigationView时,我会得到: 我正在从一个片段初始化BottomNativigationView。我猜这就是问题所在,但我想不出解决办法。 下面是为片段设置导航的活动的BottomNavigationView xml。