[android] Android : 활동에서 방향 변경을 일시적으로 비활성화

내 주요 활동에는 중단해서는 안되는 일부 데이터베이스를 변경하는 코드가 있습니다. 다른 스레드에서 무거운 작업을 수행하고 취소 불가능으로 설정 한 진행 대화 상자를 사용하고 있습니다. 그러나 전화기를 회전하면 실행중인 프로세스에 대해 정말 나쁜 활동이 다시 시작되고 강제 종료가 발생한다는 것을 알았습니다.

내가 원하는 것은 방향 변경이 활성화되는 프로세스가 완료 될 때까지 화면 방향 변경을 프로그래밍 방식으로 비활성화하는 것입니다.



답변

로 자신의 크리스에 의해 설명 자동 응답 전화,

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);