Kotlin 包返回 null

Kotlin bundle returning null

我无法在我的目标片段中获取包(参数)值,总是 return null。

navigation file

已评论。

<fragment
    android:id="@+id/nav_home"
    android:name="com.my.app.ui.home.HomeFragment"
    android:label="@string/menu_home"
    tools:layout="@layout/fragment_home" >
    <argument android:name="projectSlugArgument" />
    <action
        android:id="@+id/action_nav_home_to_projectDetailsFragment"
        app:destination="@id/projectDetailsFragment" />
    <argument android:name="searchArgument" /> // <------- sending argument
    <action
        android:id="@+id/action_nav_home_to_searchFragment"
        app:destination="@id/searchFragment" />
</fragment>
<fragment
    android:id="@+id/projectDetailsFragment"
    android:name="com.my.app.ui.ProjectDetails.ProjectDetailsFragment"
    android:label="fragment_project_details"
    tools:layout="@layout/fragment_project_details">
    <argument android:name="projectSlugArgumentValue"
        app:argType="com.my.app.classes.slugArg" />
    />
</fragment>

<fragment
    android:id="@+id/searchFragment"
    android:name="com.my.app.ui.search.SearchFragment"
    android:label="fragment_search"
    tools:layout="@layout/fragment_search">
    // <------- receiving argument  --------->
    <argument android:name="searchArgumentValue"
        app:argType="com.my.app.classes.slugArg" />
</fragment>

sending argument

private fun search(input: String) {
  val bundle = bundleOf("searchArgument" to input)
  navController.navigate(R.id.action_nav_home_to_searchFragment, bundle)
  Log.d("eeet", input) // has data in Logcat
}

receiving data

lateinit var searchArgument: String

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
  // Inflate the layout for this fragment
  val root = inflater.inflate(R.layout.fragment_search, container, false)

  searchArgument = activity?.intent?.extras?.getString("searchArgument").toString()

  Log.d("eeee", searchArgument) // retuning null in Logcat
  return root
}

您正在尝试访问此处的活动参数。您需要做的是访问片段参数,这可以通过 Fragment.getArguments().

完成

不过,我建议您更深入地了解导航组件。不建议手动处理参数,而是使用 directions.

导航组件有一个名为 Safe Args 的 Gradle 插件,它生成简单的对象和构建器 类,用于类型安全的导航和访问任何关联的参数。强烈建议使用 Safe Args 来导航和传递数据,因为它可以确保类型安全。

有关如何为 Kotlin 添加安全参数的信息,请参阅上面的 link。完成后,您的代码将如下所示:

发送中:

private fun search(input: String) {
  val action =  HomeFragmentDirections.action_nav_home_to_searchFragment(input)
  navController.navigate(action)
  Log.d("eeet", input)
}

正在接收:

private val args: SearchFragmentArgs by navArgs()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
  // Inflate the layout for this fragment
  val root = inflater.inflate(R.layout.fragment_search, container, false)

  Log.d("eeee", args.searchArgumentValue)
  return root
}