android 代码如何从中获取 activity? material-组件-android-代码实验室

How does this android code get the activity from ? material-components-android-codelabs

material-components-android-codelabs 是 material 组件的 git 演示代码库。在这个 repo 的 102-starter 分支中,在 LoginFragment.kt 中,有这段代码

(actvity as NavigationHost).navigateTo(ProductGridFragment(),false)

在 import 语句中,似乎没有任何内容表明 activity 来自何处,使用 android studio 查找任何声明都指向具有签名 public final FragmentActivity getActivity() 的函数。 activity 是如何设置并带入片段范围的?

getActivity()Fragment 实例上的方法,Kotlin 允许您访问 Java 风格的 setter 和 getter as though they're properties:

// getters
val newThing = stuff.getThing()
val newThing = stuff.thing

// setters
stuff.setThing(newThing)
stuff.thing = newThing

// boolean setters
dog.setGood(true)
dog.isGood = true

// boolean getters
val goodBoy = dog.isGood()
val goodBoy = dog.isGood

请注意,无论您是获取还是设置,属性 版本看起来都一样,您只是读取和写入单个“属性”。在幕后,它正在调用相关函数。

Fragment 有一个函数:final public FragmentActivity getActivity()

-> 因为你在 fragment 的范围内,而且函数也在 fragment 范围内,你不需要任何导入

为了能够使用此 activity 引用,您的片段需要附加到 activity。 => 这应该发生在 onAttatch().

左右

最后提示:当您处于确定有支持的生命周期中时 activity,您可以使用 requireActivity() 来避免不必要的空值检查

Kotlin 允许您直接获取和设置属性,而无需调用方法。例如。您可以直接使用 activity 而不是调用 getActivity。所以 (actvity as NavigationHost) 实际上转化为 (getActivity() as NavigationHost)

检查 Kotlin 参考资料 here。引用链接文档:

To use a property, simply refer to it by its name