android LayoutInflater可以实现layout的动态载入,在应用开发中非常有用。有时会碰到这样的情况,横竖屏需要不同的布局,分别在layout-land和layout-port下建立了同名的文件。如果没有限定在横竖屏切换的时候,activity不被销毁,即在AndroidManifest.xml中没有加入android:configChanges="orientation|screenSize|keyboardHidden", 则问题很简单,在横竖屏切换的时候,activity每次都要经历destroy和create的过程,那么系统自动在activity create的时候,加载横屏或者竖屏的layout。
但是如果我们限定了横竖屏切换的时候,activity不能被销毁,那么在横竖屏切换的时候,不会触发activity的onCreate,那么这个时候怎么让系统加载不同的layout呢?显然应该在onConfigurationChanged中,判断当Configuration类的实例中的orientation为Configuration.ORIENTATION_LANDSCAPE或Configuration.ORIENTATION_PORTRAIT分别做不同的处理。我们当然的想法是在这里重新调用LayoutInflater中的inflate函数,以加载新的layout。但在实际测试中发现似乎不起作用,布局仍然为打开应用时的布局。一个变通的方法时此时利用view中的getLayoutParams获取layout参数,并且对layoutParams重新设置。此时屏幕将会加载新的layout布局。
至于为什么试图在onConfigurationChanged中LayoutInflater中的inflate重新加载layout会不起作用,将在另一篇中讨论。