如何在 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
我有这个代码:
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