在Android手机上检查方向。
问题的出现原因:
问题是由于Android手机在检测屏幕方向时返回值不正确导致的。
解决方法:
可以通过依赖Android资源解决该问题。在res/values-land
和res/values-port
文件夹中创建layouts.xml
文件,并分别添加以下内容:
res/values-land/layouts.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="is_landscape">true</bool> </resources>
res/values-port/layouts.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="is_landscape">false</bool> </resources>
在源代码中,可以通过以下方式访问当前屏幕方向:
context.getResources().getBoolean(R.bool.is_landscape)
这种方法使用了系统已经确定方向的方式,非常方便。
在默认的values文件中,该值将是什么?
在某些设备上,如果使用getResources().getConfiguration().orientation来获取屏幕方向,可能会得到错误的结果。我们在http://apphance.com中最初使用了这种方法。通过Apphance的远程日志记录,我们可以在不同设备上看到这个问题,并且我们发现这里的碎片化起了作用。
我看到了一些奇怪的情况:例如在HTC Desire HD上交替出现纵向和正方形(?!):
CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square
或者根本不改变方向:
CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0
另一方面,width()和height()总是正确的(它们被窗口管理器使用,所以最好是正确的)。我认为最好的方法是始终进行宽度/高度检查。如果你想一下,这正是你想要的 - 知道宽度是否小于高度(纵向),相反(横向)或宽度和高度是否相同(正方形)。
然后,就可以使用这段简单的代码:
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
谢谢!初始化"orientation"是多余的。getWidth和getHeight没有被弃用,是的,它们是被弃用的。请使用getSize(Point outSize)。我正在使用API 23。
-potiuk它已经被弃用了。
在Android手机上检查方向的问题可能出现的原因是屏幕方向被锁定,无法自动旋转。解决方法是通过读取传感器来获取方向信息,然后根据需要进行解释。
要检查屏幕方向,可以使用以下代码:
int orientation = getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { // 在横屏模式下 } else { // 在竖屏模式下 }
但是,如果屏幕方向被锁定,上述方法将无法正常工作。在这种情况下,可以使用加速度计或重力传感器来正确获取方向信息。
另外,如果手机屏幕被分成两个屏幕,上述方法将返回true,但可能无法正确判断方向。
更多信息可以在Android开发者网站上找到。