Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 使用导航组件在BottomNavigationView中传递参数_Kotlin_Androidx - Fatal编程技术网

Kotlin 使用导航组件在BottomNavigationView中传递参数

Kotlin 使用导航组件在BottomNavigationView中传递参数,kotlin,androidx,Kotlin,Androidx,我目前正在编写一个带有新的(对我来说)导航组件的应用程序。我有一个导航图来导航我的应用程序,我有一个带有BottomNavigationView的片段,其中有3个单独的片段,我已经成功地更新了它,使用带有与导航项匹配的ID的菜单来使用导航组件(就我的问题而言)。我的片段以前都使用newInstance方法将bundle传递给onCreate,现在显然没有使用,但我仍然需要将bundle传递给我的片段 我还没有找到任何这样做的例子,因为片段是隐式创建的 我的代码结构为ClientFragment,

我目前正在编写一个带有新的(对我来说)导航组件的应用程序。我有一个导航图来导航我的应用程序,我有一个带有BottomNavigationView的片段,其中有3个单独的片段,我已经成功地更新了它,使用带有与导航项匹配的ID的菜单来使用导航组件(就我的问题而言)。我的片段以前都使用newInstance方法将bundle传递给onCreate,现在显然没有使用,但我仍然需要将bundle传递给我的片段

我还没有找到任何这样做的例子,因为片段是隐式创建的

我的代码结构为ClientFragment,它是导航抽屉等的主机片段,它是

class ClientFragment : Fragment() {

    private val viewModel: ClientViewModel by viewModel()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_client, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

       viewModel.client = arguments?.getParcelable(ARG_CLIENT)!!

        toolbar_client.title = viewModel.client.name
        toolbar_client.setNavigationOnClickListener { Navigation.findNavController(view).navigateUp() }
    }
}
这个类以前在onclick listener to my fragments上使用了一个newInstance方法,该方法使用工具viewModel.client

我在导航图中的片段都是相似的。第一个片段

class ClientDetailsFragment : Fragment() {

    private val viewModel: ClientViewModel by viewModel()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_client_details, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

       // viewModel.client = arguments?.getParcelable(ARG_CLIENT)!!

        initClientDetails()
    }

    private fun initClientDetails() {
//        text_client_details_name.text = viewModel.client.name
//        text_client_details_account_number.text = viewModel.client.accountNumber
//        text_client_details_mobile_number.text = viewModel.client.mobileNumber
//        text_client_details_landline_number.text = viewModel.client.landlineNumber
//        text_client_details_email.text = viewModel.client.email
//        text_client_details_address.text = "NOT YET IMPLEMENTED"
//
//        text_client_description_body.text = viewModel.client.description
//        text_client_system_details_body.text = viewModel.client.systemDetails
    }
}
应用程序在注释掉的行上崩溃

// viewModel.client = arguments?.getParcelable(ARG_CLIENT)!! 
我的导航图和菜单是

导航图

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/client_nav_graph"
    app:startDestination="@id/clientDetailsFragment">

    <fragment
        android:id="@+id/clientCustomersFragment"
        android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientCustomersFragment"
        android:label="ClientCustomersFragment"
        tools:layout="@layout/fragment_client_customers" />

    <fragment
        android:id="@+id/clientDetailsFragment"
        android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientDetailsFragment"
        android:label="ClientDetailsFragment"
        tools:layout="@layout/fragment_client_details"/>

    <fragment
        android:id="@+id/clientJobHistoryFragment"
        android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientJobHistoryFragment"
        android:label="ClientJobHistoryFragment"
        tools:layout="@layout/fragment_client_job_history" />

</navigation>
更新:

我的争论问题是通过使用一个视图模型解决的,该模型在BottomNavigationView中的所有片段之间共享(我在向我的朋友键入问题时意识到这一点),而导航本身我将其添加到ClientFragment中

bottom_nav_client.setupWithNavController(
            Navigation.findNavController(
                    view.findViewById<View>(R.id.fl_client_nav_container)
            )
    )
bottom_nav_client.setupWithNavController(
Navigation.findNavController(
view.findViewById(R.id.fl\客户端\导航\容器)
)
)
我的xml用于fragment_客户端

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar_client"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navigationIcon="?attr/NavigationBackIconLight"
        app:titleTextColor="@color/white" />

    <fragment
        android:id="@+id/fl_client_nav_container"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottom_nav_client"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar_client"
        app:navGraph="@navigation/client_nav_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav_client"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="?android:attr/windowBackground"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@drawable/bottom_nav_color"
        app:itemTextColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/client_menu" />

</androidx.constraintlayout.widget.ConstraintLayout>


这与如上所示的相同导航图形和菜单相结合。

导航体系结构组件显示了如何定义目标参数,在您的具体情况下,您应该创建一个自定义的
包裹类(即
客户端
)并将其作为相应片段的参数包含

<fragment
    android:id="@+id/clientCustomersFragment"
    android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientCustomersFragment"
    android:label="ClientCustomersFragment"
    tools:layout="@layout/fragment_client_customers" >

    <action
        android:id="@+id/client_to_details"
        app:destination="@+id/clientDetailsFragment" />

</fragment>

<fragment
    android:id="@+id/clientDetailsFragment"
    android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientDetailsFragment"
    android:label="ClientDetailsFragment"
    tools:layout="@layout/fragment_client_details">

    <argument
        android:name="client"
        app:argType="com.management.engineering.alarm.alarmengineermanagement.features.client.Client" />

</fragment>
目的地

val client =  ClientDetailsFragmentArgs.fromBundle(arguments).client

这段代码正好是您想要做的:


文档:

接受答案中提到的代码实验室没有提到在BottomNavigationView中向片段传递参数

使用自定义设置覆盖setupWithNavController()设置的OnNavigationItemSelectedListener:

val args = Bundle()

bottomNavigationView.setupWithNavController(navController)
bottomNavigationView.setOnNavigationItemSelectedListener { item ->
    navController.navigate(item.itemId, args)
    true
}

你是怎么做到的?@jL4我用答案更新了我的问题。当用户指出将其连接到底部导航或抽屉布局时,我们不会手动调用
navigate
,而是通过导航控制器连接到相关菜单来调用它。在“9.使用菜单、抽屉和底部导航进行导航”中,我没有看到任何关于为底部导航菜单中的目标设置参数值的内容。
val client: Client = TODO()
val navController: NavController = TODO()
navController.navigate(ClientToDetails(client))
val client =  ClientDetailsFragmentArgs.fromBundle(arguments).client
val args = Bundle()

bottomNavigationView.setupWithNavController(navController)
bottomNavigationView.setOnNavigationItemSelectedListener { item ->
    navController.navigate(item.itemId, args)
    true
}