Android 如何在扩展属性上添加lateinit变量

Android 如何在扩展属性上添加lateinit变量,android,kotlin,kotlin-android-extensions,kotlin-extension,Android,Kotlin,Kotlin Android Extensions,Kotlin Extension,我试图通过添加另一个自定义类来扩展所有实际片段。问题是我们不能从两个不同的类继承,对吗 因此,我试图通过添加以下内容来添加扩展属性: var Fragment.isFocused by Delegates.notNull<Boolean>(false) fun Fragment.setFocusListenerOn(rootView: View) { rootView.onFocusChangeListener = View.OnFocusChangeListener {

我试图通过添加另一个自定义类来扩展所有实际片段。问题是我们不能从两个不同的类继承,对吗

因此,我试图通过添加以下内容来添加扩展属性:

var Fragment.isFocused by Delegates.notNull<Boolean>(false)

fun Fragment.setFocusListenerOn(rootView: View) {
    rootView.onFocusChangeListener = View.OnFocusChangeListener { v, hasFocus ->
        this.isFocused = hasFocus
    }
}
问题是,如果您在所有NavGraph的第二个片段上,并且单击“上一步”,则所有片段都将侦听“上一步”按钮。换句话说,所有导航图都将返回到第一个片段

因此,在navigateUp之前,我想补充一点:

if (isFocused)
但是,如何让它工作呢

编辑:

我想解决的问题是: 我有多个基于web的片段,这些片段是从我添加为抽象类的类扩展而来的,代码如下:

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    if (webview.canGoBack()) webview.goBack()
    else onBackPressed()
}
我只想在用户单击“上一步”按钮时在webview上导航(如果webview可以返回),并且仅当用户位于该特定片段上时。
发生的情况是,只有一个片段(实际上是第一个添加的片段)正在侦听这些更改,而不是所有基于web的片段。

如果您创建的扩展属性具有支持字段或委托,则它是静态支持字段或委托,这意味着它由类的所有实例共享。这是因为如果不在JVM上对类进行子类化,就不可能将成员添加到类中

您将需要对Fragment进行子类化,并使用子类作为所有片段的基类

或者是一些复杂的策略,其中有一个片段到其状态的备份映射,您向片段添加生命周期侦听器,以便在片段被销毁时将其从映射中删除

但是对于您的特定用例,每次访问属性时,可能最简单的方法是检查当前的焦点视图:

val Fragment.isFocused: Boolean
    get() = activity?.currentFocus == rootView && rootView != null

虽然我没有用这种方式来干扰焦点,我也不知道你的基本导航策略是否有缺陷。我不知道只检查根视图是否有帮助。我不知道你回电话是怎么回事。

好的。谢谢你的澄清。所以我编辑了这个问题。我不确定是因为另一个静态字段,还是因为它们共享属性,所以只有第一个元素在侦听,而不是所有元素。
val Fragment.isFocused: Boolean
    get() = activity?.currentFocus == rootView && rootView != null