我正在使用类似这样的东西在浓缩咖啡上测试我的片段:
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 }
...
}
我尝试了一些在互联网上找到的解决方案,但它们效果不佳。
每个
NavArgs
类都允许您直接从其值构造一个实例 - 即,您可以使用 ErrorManagerFragmentArgs(15)
构造一个 ErrorManagerFragmentArgs
实例。可以使用每个 Args 类都有的 toBundle()
方法将其转换为 Bundle,允许您将其传递给 launchFragmentInContainer
调用:
val args = ErrorManagerFragmentArgs(15)
launchFragmentInContainer<ErrorManagerFragment>(
themeResId = R.style.MaterialTheme,
fragmentArgs = args.toBundle()
)
您必须做的第一件事是打开 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)
)
当然,现在您知道字符串资源不适用于导航图,您可能应该将参数名称替换为其他名称。