我使用以下代码为每个用户首选项设置方向锁定:
private void doLock(boolean locked) {
if (locked) {
int o = getResources().getConfiguration().orientation;
if (o == Configuration.ORIENTATION_LANDSCAPE)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else if (o == Configuration.ORIENTATION_PORTRAIT)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR
)并且屏幕正确显示LANDSCAPE
(!),然后调用doLock(true)
并且...... < / p>
而不是在当前(正确)横向视图中将屏幕锁定到LANDSCAPE
,而是锁定到倒置横向视图。即同样精确但垂直翻转(y
变为-y
)。
为什么会这样,我该如何解决这个问题?
我的初步调查显示除了常见的两个(portrait
,landscape
)之外还有quite a few种可能性,包括reverseLandscape
,但我的预感告诉我这个问题可能是device-dependent,所以通过使用它我可能只是为我的手机而不是所有其他设备解决问题。
有没有办法在所有设备中强制执行landscape
方向(从sensor
切换时)?
为了使这个更清晰,更容易重现,以下是显示问题的步骤:
SCREEN_ORIENTATION_SENSOR
),屏幕正确显示LANDSCAPE
(!),doLock(true)
LANDSCAPE
,而是锁定到倒置横向视图。即完全相同但垂直翻转(y
变为-y
)。答案 0 :(得分:9)
请尝试以下操作以通过代码禁用和启用方向(这将在API级别7及更高版本中运行):
public static void disableRotation(Activity activity) {
final int orientation = activity.getResources().getConfiguration().orientation;
final int rotation = activity.getWindowManager().getDefaultDisplay()
.getOrientation();
// Copied from Android docs, since we don't have these values in Froyo
// 2.2
int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else if (rotation == Surface.ROTATION_180
|| rotation == Surface.ROTATION_270) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
}
}
public static void enableRotation(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
答案 1 :(得分:7)
简单实用&gt;
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:screenOrientation="sensorLandscape"
</activity>
</application>
答案 2 :(得分:6)
您所描述的不是错误,而是Android 2.2或更低版本的预期行为。
@forgivegod提供了一个理论上正确的方法,除了对于Android 2.2或更低版本,screenOrientation.reverseLandscape
和screenOrientation.reversePortrait
值无法识别,即使是伪造的(如@forgivegod的代码那样)。
我打赌你顺时针旋转手机(旋转= 3)而不是逆时针旋转(旋转= 1)时会看到这个问题。
尝试使用Android 2.3或更高版本,看看会发生什么。
答案 3 :(得分:2)
尝试使用通用横向
private static final int ORIENTATION_90 = 1;
private static final int ORIENTATION_0 = 0;
private static final int ORIENTATION_180 = 2;
private static final int ORIENTATION_270 = 3;
switch (orientation)
{
default:
case ORIENTATION_0: // Portrait
//dostuff
break;
case ORIENTATION_90: // Landscape left
//do stuff
break;
case ORIENTATION_180: // Upside down.
//do stuff
break;
case ORIENTATION_270: // Landscape right
//do stuff
break;
}