내 주요 활동에는 중단해서는 안되는 일부 데이터베이스를 변경하는 코드가 있습니다. 다른 스레드에서 무거운 작업을 수행하고 취소 불가능으로 설정 한 진행 대화 상자를 사용하고 있습니다. 그러나 전화기를 회전하면 실행중인 프로세스에 대해 정말 나쁜 활동이 다시 시작되고 강제 종료가 발생한다는 것을 알았습니다.
내가 원하는 것은 방향 변경이 활성화되는 프로세스가 완료 될 때까지 화면 방향 변경을 프로그래밍 방식으로 비활성화하는 것입니다.
답변
로 자신의 크리스에 의해 설명 자동 응답 전화,
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
그리고
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
정말 매력처럼 작동합니다 … 실제 장치에서!
에뮬레이터에서 테스트 할 때 손상되었다고 생각하지 마세요. ctrl + F11 단축키는 센서 이동을 에뮬레이션하지 않고 항상 화면 방향을 변경합니다.
편집 : 이것은 최선의 대답이 아니 었습니다. 의견에서 설명했듯이이 방법에는 문제가 있습니다. 진짜 답은 여기에 있습니다 .
답변
다른 답변 중 어느 것도 나를 위해 완벽하게 트릭을 만들지 못했지만 여기에 내가 찾은 것이 있습니다.
현재 방향 잠금 …
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
방향 변경을 다시 허용해야하는 경우 기본값으로 다시 설정하십시오.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
답변
다음은 API 8 이상에서 작동하고 역 세로 및 가로에서 작동하며 “자연”방향이 가로 인 Galaxy 탭에서 작동하는보다 완전하고 최신 솔루션입니다 ( activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
방향을 잠금 해제하려면 호출 ).
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public static void lockActivityOrientation(Activity activity) {
Display display = activity.getWindowManager().getDefaultDisplay();
int rotation = display.getRotation();
int height;
int width;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
height = display.getHeight();
width = display.getWidth();
} else {
Point size = new Point();
display.getSize(size);
height = size.y;
width = size.x;
}
switch (rotation) {
case Surface.ROTATION_90:
if (width > height)
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_180:
if (height > width)
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
else
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
case Surface.ROTATION_270:
if (width > height)
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
else
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
default :
if (height > width)
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
else
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
답변
역방향 모드도 관리하기 위해 해당 코드를 사용하여 활동 방향을 수정했습니다.
int rotation = getWindowManager().getDefaultDisplay().getRotation();
switch(rotation) {
case Surface.ROTATION_180:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_270:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
case Surface.ROTATION_0:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case Surface.ROTATION_90:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
}
그리고 다시 방향을 허용하려면 :
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
답변
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
현재 방향을 가로 또는 세로로 고정하는 데 사용 합니다.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
잠금 해제 방향에 사용 합니다.
답변
답을 찾았습니다. 이를 위해 활동에서 http://developer.android.com/reference/android/R.attr.html#screenOrientation에setRequestedOrientation(int)
지정된 값 중 하나로 호출 할 수 있습니다.
스레드를 시작하기 전에 나는 setRequestedOrientation(OFF)
(OFF = nosensor)라고 불렀고 스레드가 끝나면 setRequestedOrientation(ON)
(ON = 센서)를 불렀습니다 . 매력처럼 작동합니다.
답변
모두 감사합니다. 이전 상태로 복원되었는지 확인하기 위해 Pilot_51의 솔루션을 수정했습니다. 또한 비가로 및 비세로 화면을 지원하기 위해 변경 사항을 적용했습니다 (그러나 이러한 화면에서 테스트하지는 않았습니다).
prevOrientation = getRequestedOrientation();
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}
그런 다음 복원하려면
setRequestedOrientation(prevOrientation);