和我一样,可能有这样的需求:无论设备在横屏还是竖屏状态下,对界面中某个元素执行某种操作后,根据界面中的这个元素属性,启动新的横屏或者竖屏Activity。
我还想"万能的Android API",startActivity的参数Intent对象能否携带一个标志,直接控制横屏或者竖屏。搜了半天,好像没有。。。
那如何处理?
首先Android的菜单文件即AndroidManifest.xml,其中声明的activity的screenOrientation属性决定了onCreate方法执行过程中所采用的屏幕方向。理解这句话,可以想象下面的场景。界面中有两个按键,分别标记着【启动NewActivity横屏】和【启动NewActivity竖屏】,这个NewActivity的screenOrientation值为unspecified(未指定),NewActivity只重写了必要的方法,没有任何逻辑。当界面竖屏时,点击【启动NewActivity横屏】或【启动NewActivity横屏】,NewActivity的onCreate方法执行期间,屏幕方向是竖屏(getResources().getConfiguration().orientation=1)。
显然在上述场景,点击【启动NewActivity横屏】没有实现预期的效果。这就需要在NewActivity的onCreate方法中重新请求屏幕方向。添加下面的代码,就能实现需求。
onCreate(...) {
...
Log.d(TAG,"onCreate: in");
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
...
}
查看log发现,onCreate执行了两次。这是Android系统的规定,如果不想再次执行onCreate,那么在AndroidManifest中配置Activity的congfigChanges属性。当所配置的属性发现变化时,会回调Activity的onConfigrationChanged方法。
public void onConfigrationChanged(Configuration newConfig) {
Log.d(TAG,"onConfigrationChanged: in");
}