解决 java.lang.IllegalStateException: HorizontalScrollView can host only one direc

144 阅读1分钟

问题起因

在对Fragment的动态调用进行实践时,将手机旋转为横屏状态,爆出了java.lang.IllegalStateException: HorizontalScrollView can host only one direct child的Error

image.png

原因分析

根据报错显示,我们使用的HorizontalScrollView 只允许一个方向的子控件,同时联想这个Error产生的前提条件,可以知晓,当屏幕旋转时,其实整个屏幕发生了重绘,会再一次执行onCreate,添加语句会再一次执行,会拥有两个子控件

image.png

解决方案

获取屏幕的横纵向像素 -> 编写横屏/竖屏时对应的逻辑

//获取屏幕分辨率
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()
    }
}

image.png

image.png

参考文献