在android 开发中,如果碰到需要动态去设置一个activity的朝向时,也许你会说简单,调用:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)一句话搞定
但是当你需要通过当前这个activity调起一个dialog时,你会发现,我明明设置了横屏,为什么dialog没有自己去找横屏的布局资源?
通过this.getResources().getConfiguration().orientation查看,发现是1,对应的值是Configuration.ORIENTATION_PORTRAIT,代表的是竖屏。所以会导致通过这个引用创建的各种控件都会去调用竖屏的资源文件了。
也许这并不是一个常见的需求,但是当要做的时候还是挺头痛的。
我也是在碰到做一个支付sdk时,客户端需求是根据应用当前activity的朝向来调起对应的支付,但是我们又不能使用客户端的activity来调起我们需要的dialog提示框(因为客户端activity生命周期你不可控)。
所以只能使用自己的activity。
以下两种方法:
麻烦法:
在需要动态设置朝向的activity的配置文件中加上一句:
android:screenOrientation="behind" 意思就是按当前任务栈的自己下面的一个activity的朝向来设置,google还是挺人性化的,知道我们可能会有这种需求。
但是你也会发现,加上之后,为什么我前一个activity是横屏,后一个设置了android:screenOrientation="behind" 还是竖屏?
如果你仔细去观察还会发现onCreate方法走了两次。
通过this.getResources().getConfiguration().orientation来查看当前activity的朝向
第一次:是2,说明是横的。
第二次:是1,又变成竖的了。
猜测可能是因为屏幕翻转了,导致activity重新执行生命周期方法了。
这也没关系,我们知道通过设置android:configChanges="keyboardHidden|orientation|screenSize"就可以让activity不重新onCreate方法了。
但是设置之后是没走onCreate,可是显示的还是坚屏,这个好办,在设置android:configChanges后,activity会在屏幕发生翻转时回调onConfigurationChanged方法,我们通过设置实现他就可以设置显示了。
通过在里面调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);方法,就可以设置横屏了,同样,也可以设置竖屏,这个需要看你的需求,比如像我这样,是需要和前面的activity一样的朝向的,就可以在intent中传递一个值过来,标明是需要横的还是竖的。
到这里,你就最终来通过这个this.getResources().getConfiguration().orientation来获得当前的页面朝向,就会发现和需求的一样了
简易法:
此外,别一种方便的方法就是在设置了android:screenOrientation="behind" 了之后,再为需要动态横竖屏的activity设置主题为Theme.Translucent下的任意一个主题,就可以了,可以不用上面的操作