如何在Kotlin中为变量设置侦听器

Sam*_*uel 1 android listener kotlin

如何设置接口侦听器以检测Kotlin中的变量更改。我成功用Java实现了以下内容,但是在Kotlin中遇到了问题:

接口:

public interface InterfaceRefreshList
    {
    public void refreshListRequest();
    }
Run Code Online (Sandbox Code Playgroud)

包含侦听器的类:

public class SignalChange
    {
    private static boolean refreshListSwitch;
    private static List<InterfaceRefreshList> refreshListListeners = new ArrayList<>();
    public static void setRefreshList(boolean value)
    {
    refreshListSwitch = value;
    for(InterfaceRefreshList l : refreshListListeners)
        l.refreshListRequest();
    }
    public static void addRefreshListListener(InterfaceRefreshList l)
        {
        refreshListListeners.add(l);
        }
    }
Run Code Online (Sandbox Code Playgroud)

侦听器正在侦听的类:

public class FragmentBrowse extends Fragment
{
    public FragmentBrowse() /// Constructor
        {
        SignalChange.addRefreshListListener(() -> refreshList());
        }
    refreshList()
    {
    // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

发出变更信号:

SignalChange.setRefreshList(true);
Run Code Online (Sandbox Code Playgroud)

我可以设置接口和信号类:

class SignalChange
{
    private var refreshListSwitch: Boolean = false
    var setSwitch: Boolean
        get() = refreshListSwitch
        set(value)
        {
            refreshListSwitch = value
        }

    private var refreshListListeners = ArrayList<InterfaceRefreshPersonsList>()
    fun sendRefreshSignal()
    {
        for(l in refreshListListeners) l.refreshPersonsList()
    }

    fun addRefreshListListener(l: InterfaceRefreshPersonsList)
    {
        refreshListListeners.add(l)
    }

}
Run Code Online (Sandbox Code Playgroud)

但是我无法在FragmentBrowse类中设置侦听器。片段类不允许构造函数。

Ser*_*gey 8

您可以使用内置的Kotlin委托,例如:

object SignalChange {
    var refreshListListeners = ArrayList<InterfaceRefreshList>()

    // fires off every time value of the property changes
    var property1: String by Delegates.observable("initial value") { property, oldValue, newValue ->
        // do your stuff here
        refreshListListeners.forEach { 
            it.refreshListRequest()
        }
    }
}

interface InterfaceRefreshList {
    fun refreshListRequest()
}
Run Code Online (Sandbox Code Playgroud)

像这样添加侦听器:

SignalChange.refreshListListeners.add(object : InterfaceRefreshList {
    override fun refreshListRequest() {
        refreshList()
    }
})
Run Code Online (Sandbox Code Playgroud)

要么

接口的intead可以使用lambda

object SignalChange {
    var refreshListListeners = ArrayList<() -> Unit>()

    // fires off every time value of the property changes
    var property1: String by Delegates.observable("initial value") { property, oldValue, newValue ->
        // do your stuff here
        refreshListListeners.forEach {
            it()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要添加侦听器,只需调用:

SignalChange.refreshListListeners.add(::refreshList)
//or
SignalChange.refreshListListeners.add { refreshList() }

fun refreshList() {

}
Run Code Online (Sandbox Code Playgroud)


Ahm*_*esh 7

KOTLIN 中监听变量的简单方法

private var myVariableName by Delegates.observable(0) { property, oldValue, newValue ->
             Log.d(TAG,"New Value $newValue")
             Log.d(TAG,"Old Value $oldValue")
        }
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.properties/-delegates/

  • 哦,我明白了。指定 0 作为初始值会自动使 myVariableName 成为 Int。所以我们应该对字符串执行 ```myVariableName by Delegates.observable("Initial Text")``` (2认同)