如何在 Kotlin 的上下文对象中访问变量?

How do I access variables within a context object in Kotlin?

我有这个代码:

inner class MyGestureListener: GestureDetector.SimpleOnGestureListener() {

    override fun onDown(event: MotionEvent): Boolean {
        return true
    }

    override fun onSingleTapUp(event: MotionEvent): Boolean {

        val colWidth = width / (colCount + 1) // works out the width of each column
        var colTouch = event.x.toInt() / colWidth // works out what column has been selected

        val rowHeight = height / ((rowCount * 2) + 1)
        var rowTouch = event.y.toInt() / rowHeight

        return true
    }

}

如您所见,n 用作对上下文的引用。在上下文中是一个对象 boxGame。这是我的意思的一个例子。

但是,我不知道如何从 n 访问该对象。我原以为会是 n.boxGame 但 Android Studio 将其标记为错误。

对不起,我没有评论权限。我认为您应该告诉我们 boxGame 是什么以及它在上下文中的含义。它是 activity 名称还是片段名称?

只有当 Context 有一个名为 boxGame 的 public 变量时,你才能调用 n.boxGame,但据我所知,没有这样的东西。

如果您需要在 GameView 接收到点击事件时将信息从 GameView 传递到您的 Game,您可以编写一个 GameViewEventListener 接口并让您的游戏实现该接口以监听那些游戏视图事件。

interface GameViewEventListener {
  fun onTapEvent(rowHeight: Double, rowTouch: Double)
  // other events
}

在您的 GameView class 中,您需要允许听众订阅和取消订阅这些游戏事件。为此,您可以简单地保留一个实例字段:

private var gameEventListener: GameViewEVentListener? = null

然后,当事件发生时,您可以通知侦听器:

 override fun onSingleTapUp(event: MotionEvent): Boolean {

        val colWidth = width / (colCount + 1) // works out the width of each column
        var colTouch = event.x.toInt() / colWidth // works out what column has been selected

        val rowHeight = height / ((rowCount * 2) + 1)
        var rowTouch = event.y.toInt() / rowHeight

        gameEventListener?.onTapEvent(rowHeight, rowTouch)

        return true
    }

最后,您需要在游戏中实现该接口 class:

override fun onTapEvent(rowHeight: Double, rowTouch: Double) {
    // do something
}

并且不要忘记在需要时 subscribe/unsubscribe(您可以为此在 GameView 中创建一些实例方法):

// whenever you want to start listening for events
gameView.gameEventListener = this

...

// whenever you want to stop listening
gameView.gameEventListener = null