Вызов onBackPressed внутри частного класса в Kotlin - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать класс детектора жестов, следуя инструкциям на Android Разработчикам веб-сайте , но я застрял, потому что не могу вызвать метод onBackPressed () внутри нового частного класса созданный мной. Как мне это сделать? Это мой код:

    class DetailActivity : AppCompatActivity() {

    private lateinit var mDetector: GestureDetectorCompat

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.detail_activity)

        mDetector = GestureDetectorCompat(this, MyGestureListener())
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mDetector.onTouchEvent(event)
        return super.onTouchEvent(event)
    }

    private class MyGestureListener : GestureDetector.SimpleOnGestureListener() {

        private val SWIPE_DISTANCE_THRESHOLD = 100
        private val SWIPE_VELOCITY_THRESHOLD = 100

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

        override fun onFling(
                event1: MotionEvent,
                event2: MotionEvent,
                velocityX: Float,
                velocityY: Float
        ): Boolean {
            //TODO
            var distanceX = event2.getX() - event1.getX()
            var distanceY = event2.getY() - event1.getY()
            if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                //CALL onBackPressed
            }
            return true
        }
    }
}

Новый код:

    class DetailActivity : AppCompatActivity() {

    private lateinit var mDetector: GestureDetectorCompat

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.detail_activity)

        mDetector = GestureDetectorCompat(this, MyGestureListener())
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mDetector.onTouchEvent(event)
        return super.onTouchEvent(event)
    }

    override fun onBackPressed() {
        super.onBackPressed()
    }

    inner class MyGestureListener : GestureDetector.SimpleOnGestureListener() {

        private val SWIPE_DISTANCE_THRESHOLD = 100
        private val SWIPE_VELOCITY_THRESHOLD = 100

        override fun onDown(event: MotionEvent): Boolean {
            System.out.println("LOGG")
            this@DetailActivity.onBackPressed()
            return true
        }

        override fun onFling(
                event1: MotionEvent,
                event2: MotionEvent,
                velocityX: Float,
                velocityY: Float
        ): Boolean {
            var distanceX = event2.getX() - event1.getX()
            var distanceY = event2.getY() - event1.getY()
            if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0) {
                    System.out.println("LOGG")
                    this@DetailActivity.onBackPressed()
                }
            }
            return true
        }
    }
}

РЕДАКТИРОВАТЬ: я добавил новый метод onBackPressed , и я вызвал его через внутренний класс, но Ничего не изменилось. Я также не вижу отпечатки в моем Logcat.

1 Ответ

2 голосов
/ 19 марта 2020

Сделать его private inner class.
В Kotlin вложенные классы по умолчанию имеют статус c. Чтобы сделать его внутренним классом, который может обращаться к свойствам окружающего класса, вы должны использовать ключевое слово «inner».

См. Java внутренний класс и статус c вложенный класс

...