답변:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
활동에서 호출되면 가로로 고정됩니다. ActivityInfo 클래스에서 다른 플래그를 찾으십시오. 다시 세로로 잠 그거나 센서 / 슬라이더 구동으로 만들 수 있습니다.
getConfiguration이 반환하는 것과 setRequestedOrientation이 원하는 것 사이의 차이에주의하십시오. 둘 다 int이지만 다른 상수 정의에서 비롯됩니다.
180도 뒤집기를 허용하면서 현재 방향을 잠그는 방법은 다음과 같습니다.
int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
이것은 역 세로 및 역 가로 장치에서 작동합니다.
잠금 방향 :
int orientation = getActivity().getRequestedOrientation(); int rotation = ((WindowManager) getActivity().getSystemService( Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; } getActivity().setRequestedOrientation(orientation);
잠금 해제 방향 :
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
"Returns the rotation of the screen from its "natural" orientation."
소스를 가져옵니다 . 따라서 ROTATION_0이 세로라고 말하는 휴대 전화에서는 정확할 수 있지만 태블릿에서는 '자연스러운'방향이 가로 일 가능성이 높고 ROTATION_0은 세로 대신 가로를 반환해야합니다.
비슷한 경우가있는 것 같았습니다. 모든 오리엔테이션을 지원하고 싶었지만 워크 플로의 특정 지점 이후에 현재 오리엔테이션을 유지해야했습니다. 내 솔루션은 다음과 같습니다.
보호 된 워크 플로 시작시 :
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
보호 된 워크 플로 종료시 :
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
태블릿을 지원하는 @pstoppani 답변의 대안 (@pstoppani 답변과 마찬가지로이 기능은 기기> 2.2에서만 작동 함)
- Samsung Galaxy SIII
및Samsung Galaxy Tab 10.1
public static void lockOrientation(Activity activity) {
Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
int tempOrientation = activity.getResources().getConfiguration().orientation;
int orientation = 0;
switch(tempOrientation)
{
case Configuration.ORIENTATION_LANDSCAPE:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
case Configuration.ORIENTATION_PORTRAIT:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
activity.setRequestedOrientation(orientation);
}
||
에 rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90
와와 rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270
. 그래서 나는 두 가지 의심을 가지고 있습니다 :::: 첫째, 왜 두 번째 경우 ROTATION_0
대신 왜 ROTATION_180
그리고 다른 이유는 180이 아닌 90으로 0도를 확인 합니까 ?
||
검사는 가로 대 세로를보고하는 장치에 따라 가능한 두 가지 기본 방향을 처리합니다.
내 코드는 다음과 같습니다. 이러한 방법 중 하나로 화면을 잠그고 작업이 완료되면 unlockOrientation으로 잠금을 해제 할 수 있습니다.
/** Static methods related to device orientation. */
public class OrientationUtils {
private OrientationUtils() {}
/** Locks the device window in landscape mode. */
public static void lockOrientationLandscape(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
/** Locks the device window in portrait mode. */
public static void lockOrientationPortrait(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
/** Locks the device window in actual screen mode. */
public static void lockOrientation(Activity activity) {
final int orientation = activity.getResources().getConfiguration().orientation;
final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
// 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;
// Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
if (!BuildVersionUtils.hasGingerbread()) {
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);
}
}
}
/** Unlocks the device window in user defined screen mode. */
public static void unlockOrientation(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
}
}
위의 @pstoppani 대답에 대한 Xamarin 변환은 다음과 같습니다.
참고 : 이것은 조각에 대한 것이므로 활동을 바꿉니다. 와 이. 활동 내에서 사용되는 경우.
public void LockRotation()
{
ScreenOrientation orientation;
var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation;
switch (surfaceOrientation) {
case SurfaceOrientation.Rotation0:
orientation = ScreenOrientation.Portrait;
break;
case SurfaceOrientation.Rotation90:
orientation = ScreenOrientation.Landscape;
break;
case SurfaceOrientation.Rotation180:
orientation = ScreenOrientation.ReversePortrait;
break;
default:
orientation = ScreenOrientation.ReverseLandscape;
break;
}
Activity.RequestedOrientation = orientation;
}
public void UnlockRotation()
{
Activity.RequestedOrientation = ScreenOrientation.Unspecified;
}
이것은 사용하기 전에 다른 접근 방식으로 진행된 것처럼 테스트되지 않았지만 유용 할 수 있습니다.