Как переключиться на другой макет XML после нажатия кнопки?

Я хотел бы иметь один файл kotlin с логикой, и я хотел бы, чтобы пользователи могли переключаться между двумя разными макетами XLM (логика программы остается прежней, но расположение кнопок должно меняться при нажатии на кнопку).

Я просто добавляю функцию setContentView в setOnClickListener для этой кнопки, чтобы загрузить макет activity_main_second_layout.xml.

PS. Activity_main_second_layout.xml почти такой же как и activity_main.xml, я только изменил положение элементов (не имена элементов)

button_switch_to_the_second_design.setOnClickListener {

setContentView(R.layout.activity_main_second_layout);

}

При нажатии на кнопку, воаля, раскладка действительно меняется на вторую. НО функционал программы уже не работает, логика пропадает. Кажется, мне нужно как-то возобновить работу программы, чтобы код снова работал без прерываний, включая потерю переменных.


person Lukáš Němec    schedule 15.02.2019    source источник
comment
Есть еще один подход, использовать фрагменты   -  person Artem Botnev    schedule 15.02.2019


Ответы (1)


Есть много способов сделать это.

На мой взгляд, не стоит пытаться менять раскладку во время выполнения - это возможно, но нужно переопределить setContentView и перебиндить все представления и всех слушателей (или сделать это в другом методе, который будет вызываться после смены раскладки).

Итак... Вот так:

fun sth() {
    setContentView(R.layout.activity_main_second_layout)
    rebindLayout(R.layout.activity_main_second_layout)
}

fun rebindLayout(@LayoutRes layoutId: Int) {
    when (layoutId) {
        R.layout.activity_main_first_layout -> { /* rebind views here */ }
        R.layout.activity_main_second_layout -> { /* rebind views here */ }
    }
}


Другой, на мой взгляд, лучше создать независимые фрагменты и изменить фрагмент через fragmentManager. Подходит другие - ViewAnimator, ViewSwitcher.

person Cililing    schedule 15.02.2019
comment
Я новичок в программировании на Kotlin и Android. Спасибо, что указали мне на фрагменты, это то, что я собираюсь попробовать. - person Lukáš Němec; 18.02.2019