Android - 使用 espresso 启动片段传递导航参数

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

我正在使用类似这样的东西在浓缩咖啡上测试我的片段:

launchFragmentInContainer<ErrorManagerFragment>(themeResId = R.style.MaterialTheme)

但是,我的 ErrorManagerFragment 需要一个参数,但我不知道如何将它传递给我的片段。

internal class ErrorManagerFragment : Fragment(R.layout.fragment_error_manager) {

    private val navArgs: ErrorManagerFragmentArgs by navArgs()
    private val attemptNumber by lazy { navArgs.StringNumAttemptError }

    ...
}

我尝试了一些在互联网上找到的解决方案,但它们效果不佳。

android android-espresso android-navigation
2个回答
3
投票

每个

NavArgs
类都允许您直接从其值构造一个实例 - 即,您可以使用
ErrorManagerFragmentArgs(15)
构造一个
ErrorManagerFragmentArgs
实例。可以使用每个 Args 类都有的
toBundle()
方法将其转换为 Bundle,允许您将其传递给
launchFragmentInContainer
调用:

val args = ErrorManagerFragmentArgs(15)
launchFragmentInContainer<ErrorManagerFragment>(
    themeResId = R.style.MaterialTheme,
    fragmentArgs = args.toBundle()
)

0
投票

您必须做的第一件事是打开 NavGraph 并检查有关此片段的一些信息:

<fragment
    android:id="@+id/errorManagerFragment"
    android:name="br.com.itau.oneclick.presentation.view.fragment.ErrorManagerFragment"
    android:label="fragment_manager_error"
    tools:layout="@layout/fragment_error_manager">
        
    <argument
        android:name="numAttemptError"
        android:defaultValue="1"
        app:argType="integer" />

</fragment>

在这里,我们必须了解一些有趣的事情。字符串资源不能很好地与 NagArgs 配合使用,因此捆绑包中的键将不是

@string/num_attempt_error
的值,而是该字符串本身。您可以通过打开
ErrorManagerFragmentArgs
类来检查这一点:

data class ErrorManagerFragmentArgs(
  val StringNumAttemptError: Int = 1
) : NavArgs {
  fun toBundle(): Bundle {
    val result = Bundle()
    result.putInt("numAttemptError", this.StringNumAttemptError)
    return result
  }

  companion object {
    @JvmStatic
    fun fromBundle(bundle: Bundle): ErrorManagerFragmentArgs {
      bundle.setClassLoader(ErrorManagerFragmentArgs::class.java.classLoader)
      val __StringNumAttemptError : Int
      if (bundle.containsKey("numAttemptError")) {
        __StringNumAttemptError = bundle.getInt("@string/num_attempt_error")
      } else {
        __StringNumAttemptError = 1
      }
      return ErrorManagerFragmentArgs(__StringNumAttemptError)
    }
  }
}

知道了这一点,您可以将此值传递给您的包,如下所示:

launchFragmentInContainer<ErrorManagerFragment>(
    themeResId = R.style.MaterialTheme,
    fragmentArgs = bundleOf("numAttemptError" to attempts)
)

当然,现在您知道字符串资源不适用于导航图,您可能应该将参数名称替换为其他名称。

© www.soinside.com 2019 - 2024. All rights reserved.