问题起因
在对Fragment的动态调用进行实践时,将手机旋转为横屏状态,爆出了java.lang.IllegalStateException: HorizontalScrollView can host only one direct child的Error
原因分析
根据报错显示,我们使用的HorizontalScrollView 只允许一个方向的子控件,同时联想这个Error产生的前提条件,可以知晓,当屏幕旋转时,其实整个屏幕发生了重绘,会再一次执行onCreate,添加语句会再一次执行,会拥有两个子控件
解决方案
获取屏幕的横纵向像素 -> 编写横屏/竖屏时对应的逻辑
//获取屏幕分辨率
val metrics = resources.displayMetrics
val screeWidth = metrics.widthPixels
val screeHeight = metrics.heightPixels
val fm: FragmentManager = supportFragmentManager
val temp: Fragment? = fm.findFragmentById(R.id.listFragment)
/**
* 横屏时动态移除不显示,竖屏时正常显示
*/
if (screeWidth > screeHeight) { //横屏
if (temp != null) {
fm.beginTransaction().remove(temp).commitNow()
}
} else { //竖屏
if (temp == null){
fm.beginTransaction().add(R.id.listFragment, ListFragment()).commitNow()
}
}