kotlin - 单击按钮后如何切换到另一个 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);
}
当点击按钮时,voala,布局真的变成了第二个。但是程序的功能不再起作用,逻辑消失了。似乎我需要以某种方式恢复程序的运行以使代码再次运行而不会中断,包括变量丢失。
解决方案
有很多方法可以做到这一点。
在我看来,您不应该尝试在运行时更改布局 - 这是可能的,但您必须覆盖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
.
推荐阅读
- bash - 用于多 cloudformation 堆栈的 bash 脚本
- php - laravel 控制器函数可以是变量吗?
- kotlin - Kotlin(::) 中的成员引用
- python - Appium:无法单击元素
- maven - 如何将人工制品推送到 maven.pkg.github.com?
- javascript - 如何将大型数组发送到 MVC 控制器
- machine-learning - Flasgger 执行成功但不显示 XML 正文
- typescript - 如何在运行时获取 TypeScript 枚举类型的名称?
- amazon-web-services - 请解决 AWS CLI 中的错误 {参数验证失败}
- c# - 为什么对两条短裤进行异或运算会给出一个整数?