Как мне получить доступ к переменным в объекте контекста в Kotlin? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть этот код:

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. Вот пример того, что я имею в виду.

Screenshot of the debugging tool in Android Studio

Однако я не могу понять, как я могу получить доступ к этому объекту из n. Я бы подумал, что это будет n.boxGame, но Android Studio помечает это как неправильное.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Если вам нужно передать информацию из вашего GameView в вашу игру, когда представление получает событие касания, вы можете написать интерфейс GameViewEventListener и заставить вашу игру реализовать этот интерфейс для прослушивания этих событий просмотра игры.

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

В вашем классе GameView вы должны разрешить слушателям подписываться и отписываться от этих игровых событий. Для этого вы можете просто сохранить поле экземпляра:

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
    }

Наконец, вам нужно реализовать этот интерфейс в вашем классе Game:

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

и не забывайте подписываться / отписываться при необходимости (для этого вы можете создать несколько экземпляров методов в GameView):

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

...

// whenever you want to stop listening
gameView.gameEventListener = null
0 голосов
/ 02 мая 2020

Извините, но у меня нет права комментировать. Я думаю, что вы должны сказать нам, что такое boxGame и как это может быть в контексте. Это название деятельности или название фрагмента?

Вы можете вызывать n.boxGame только тогда, когда Context имеет переменную publi c с именем boxGame, но AFAIK не существует.

...