Как исправить: кнопки «рыхли» OnClickListener при изменении макета в Kotlin - PullRequest
0 голосов
/ 16 июня 2019

У меня есть два макета в Котлине, каждый с одной кнопкой, и я просто хочу переключаться между ними. Поэтому я добавил OnClickListener для обоих

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

        button_foward.setOnClickListener(View.OnClickListener {
            setContentView(R.layout.second)
            button_back.setOnClickListener(View.OnClickListener {
                setContentView(R.layout.activity_main)
            })
        })

Ну, это на самом деле работает. Я могу перейти ко второму макету и переключиться обратно на первый, но не могу снова открыть второй макет!

Я подумал, что мне придется переопределить Слушатель после возврата к основному виду, поэтому я создал две отдельные функции для установки представлений.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this@MainActivity.createMainScreen()
        })
    }

    fun createMainScreen(){
        setContentView(R.layout.activity_main)
        button_foward.setOnClickListener(View.OnClickListener {
            this@MainActivity.createSecondScreen()
        })
    }
    fun createSecondScreen(){
        setContentView(R.layout.second)
        button_back.setOnClickListener(View.OnClickListener {
            this@MainActivity.createMainScreen()
        })
    }

Этот способ работал, когда я пытался избавиться от той же проблемы в Java, но в Kotlin я все еще могу использовать каждую кнопку только один раз.

Как мне это решить? Можно ли (нужно ли) сбросить кнопки перед их переопределением?

Или может быть альтернатива для использования setContentView?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Хорошо,

Я подумал, что прямое присвоение идентификатора кнопки, например

button_foward.setOnClickListener(View.OnClickListener {       
                this@MainActivity.createSecondScreen() })

, должно привести к тому же результату, как

this.findViewById<Button>(R.id.button_foward).setOnClickListener(View.OnClickListener {
            this@MainActivity.createSecondScreen()})

Я виделПервый пример кода где-то в каком-то учебном пособии и подумал, что это будет обычный способ Kotlin сделать это.Даже Android Studio предложила мне сделать это, но, похоже, только второй способ делает то, что я хочу в этом случае.

Ну, проблема решена: D Спасибо!

0 голосов
/ 16 июня 2019

Я подозреваю, что button_back настроен неправильно.

Более чистый подход может состоять в том, чтобы иметь один макет, содержащий обе альтернативы, а затем установить видимость альтернатив в обработчиках кликов.

Мне действительно нравится Anko вместо XML для определения макетов, потому что это делает такие типы поведения более читабельными и автономными.

...