Android에서 방향 변경을 비활성화하려면 어떻게합니까?


287

세로 모드로 사용하려는 응용 프로그램이 있으므로 매니페스트 XML에서 android : screenOrientation = "portrait"를 정의했습니다. 이것은 HTC Magic 전화 에서도 작동 하며 다른 전화에서도 방향 변경을 방지합니다.

그러나 하드웨어 QWERTY 키보드 (가상 키보드가 아님)를 열 때 HTC G1 전화에 문제가 있습니다. 내 활동은 세로 모드로 유지되지만 다시 시작되고 모든 상태가 손실됩니다. 이것은 HTC Hero 버전 에서는 발생하지 않습니다 .

내 응용 프로그램은 상당히 커서 키보드를 열 때 응용 프로그램이 다시 시작되고 모든 상태가 손실되는 것을 원하지 않습니다. 어떻게 방지 할 수 있습니까?



답변:


317

2013 년 4 월 업데이트 :이 작업을 수행하지 마십시오. 내가 처음 질문에 대답했을 때 2009 년에는 좋은 생각이 아니었고 지금은 실제로 좋은 생각이 아닙니다. 다음과 같은 이유로 hackbod의이 답변을 참조하십시오.

안드로이드에서 방향 변경시 asynctask로 활동을 다시로드하지 마십시오.

android:configChanges="keyboardHidden|orientation"AndroidManifest.xml에 추가 하십시오. 이를 통해 시스템에서 처리 할 구성 변경 내용을 알 수 있습니다.이 경우 아무 것도 수행하지 않습니다.

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

자세한 내용은 개발자 참조 configChanges 를 참조하십시오.

그러나 전화 통화 등으로 언제든지 응용 프로그램이 중단 될 수 있으므로 응용 프로그램이 일시 중지 될 때 상태를 저장하는 코드를 추가해야합니다.

업데이트 : Android 3.2부터 "screenSize"도 추가해야합니다.

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

개발자 안내서 에서 구성 처리 사용자 스스로 변경

주의 : Android 3.2 (API 레벨 13)부터는 기기가 세로 방향과 가로 방향으로 전환 될 때 "화면 크기"도 변경됩니다. 따라서 API 레벨 13 이상 (minSdkVersion 및 targetSdkVersion 속성에 의해 선언 된)으로 개발할 때 방향 변경으로 인한 런타임 재시작을 방지하려면 "orientation"값 외에 "screenSize"값을 포함해야합니다. 즉,을 선언해야합니다 android:configChanges="orientation|screenSize". 그러나 애플리케이션이 API 레벨 12 이하를 대상으로하는 경우 활동은 항상이 구성 변경 자체를 처리합니다 (이 구성 변경은 Android 3.2 이상 디바이스에서 실행중인 경우에도 활동을 다시 시작하지 않습니다).


36
이것에 추가하고 실제로 명시 적으로하기 위해 Android는 방향 변경에 관계없이 언제든지 응용 프로그램을 무자비하게 종료 할 수 있으므로 onPause () 및 onSaveInstanceState ()를 사용하여 상태를 저장해야합니다.
Eric Mill

3.2 업데이트는 매우 유용했고 나를 막고있었습니다. 왜 onConfigurationChanged 핸들러가 실행되지 않았는지 알 수 없었습니다. 감사!
sweetlilmre

2.3.x에서 세 번째 param-screenSize를 찾을 수 없습니다. screenLayout으로 변경해야합니까?
deadfish

2
@Lumma 아니요, "screenSize"는 Android 3.2 이상에서만 필요합니다. 어떤 수준의 API를 타겟팅하고 있습니까? 13 레벨 이상을 타겟팅하는 경우에만 추가해야한다고 생각합니다. 명확하게 답변을 업데이트하겠습니다.
Intrications

1
다른 사람들에게 도움이되는 경우를 대비하여 변경 사항을 무시하는 <... android : configChanges = "orientation"...>과 <... android : screenOrientation = "portrait"...> 기본값을 정의하십시오.
Sogger

97

언급 된 Intrications (이전 Ashton) 로 AndroidManifest.xml을 수정 하고 활동이 원하는대로 onConfigurationChanged 이벤트를 처리하는지 확인해야합니다. 다음과 같이 보입니다.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

드미트리 Zaitsev에 의해 언급 한 바와 같이, 넣어 더 나은 setRequestedOrientation()의를 onCreate().
Timmmm

3
하지 않습니다 onConfigurationChanged()하기 전에 전화를받을 onCreate()에서 OnCreate에서 contentViews를 설정하기 전에 방향을 설정 때문에이 경우 더 좋은 방법은, 자신이 속한 구성을 설정하면 또한 청소기 이 대답은 여전히 좋은 의미 때문에.
사무엘

39

나는 항상 둘 다 필요하다는 것을 알았습니다

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"

22

말했듯이, android:configChanges(매니페스트 파일에서) 활동 세트 를 keyboardHidden|orientation다음과 같이 설정하십시오.

1) 재정의 onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2)이 줄을 활동에 추가하십시오. onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

onConfigurationChanged앱이 세로 모드로 돌아간 다음 다시 가로로 돌아 가기 때문에 같은 줄을 추가하는 것이 좋습니다. 한 번만 발생하지만 성가신 일입니다.

또한 android:screenOrientation="nosensor"(매니페스트에서) 활동을 설정할 수 있습니다 . 그러나이 방법을 사용하면 방향 변경을 전혀 처리 할 수 ​​없습니다.


회전 할 때 활동을 다시 만들지 않으려면 어떻게해야합니까?하지만 사용자가 OS 설정을 통해 방향을 잠글 수 있도록하고 싶습니다.
안드로이드 개발자

@androiddeveloper는 별도의 질문으로 이미 답변이 있습니다 : stackoverflow.com/a/14771495/926907
Dmitry Zaytsev

귀하의 링크는 구성이 변경 될 때 직접 콘텐츠를 변경하는 것에 관한 것입니다. 그러나 사용자가 OS를 통해 방향을 고정하도록 선택한 경우 활동의 회전을 피하고 싶습니다 (정확하게 보이는 것처럼 유지되도록) 설정 (알림 창에서 빠른 설정을 통해 일부 장치에서 사용 가능).
안드로이드 개발자

@androiddeveloper 아, 이해합니다. 그런 다음이 링크를보십시오 : developer.android.com/reference/android/… 문서에 따르면 기본 방향은 이미 사용자 환경 설정을 고려해야합니다. 그렇지 않은 경우 OS 별 동작이라고 생각합니다. 나는 당신의 결과에 대해 기뻐할 것입니다-이제 나는 또한 그것에 관심이 있습니다 :)
Dmitry Zaytsev

나는 기본값이 사용자의 환경 설정을 처리한다는 것을 알고 있지만 화면을 회전 할 때 활동을 다시 만듭니다.
안드로이드 개발자


13

활동의 OnCreate 메소드에서 다음 코드를 사용하십시오.

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

이제 방향이 세로로 설정되고 변경되지 않습니다.


4
이를 통해 방향 구성이 변경 될 때마다 활동을 다시 시작하는 것을 막을 수 없습니다.
AxeEffect

또한 이전 방향의 활동을 가로 방향으로 입력하면 작동하지 않습니다.
w3bshark

10

AndroidManifest.xml 파일에서 잠 그려는 각 활동에 대해 마지막 screenOrientation행을 추가하십시오 .

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

또는 android : screenOrientation = "landscape" 입니다.


8

당신에서 의 AndroidManifest.xml 파일 :

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

또는

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

6

코드로 화면을 잠 그려면 화면의 실제 회전 (0, 90, 180, 270)을 사용해야하고 스마트 폰에서 자연스런 위치를 알아야합니다. 풍경이 될 것입니다.

다음은 코드 (잠금 및 잠금 해제 방법)이며 일부 장치 (스마트 폰 및 태블릿)에서 테스트되었으며 훌륭하게 작동합니다.

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

어떤 매개 변수를 활동으로 전달해야합니까?
WISHY

방향을 잠금 / 잠금 해제하기 위해 메소드를 호출하는 활동. 그것은 다른 활동에서 호출되는 공개 정적 유틸리티 방법입니다.
PoOk

1
잘 작동하지만 진지하게 Android는 잠금 화면 방향으로 모든 것을해야합니까? !!!
Cocorico

예. 이것은 매니페스트에서와 같이 방향을 고정시킵니다. 그러면 onConfigurationChanged가 더 이상 호출되지 않습니다. UI를 Landscape로 잠그고 onConfigurationChanged를 계속 호출하는 메소드가 있습니까? 안드로이드의 카메라 앱처럼
Ajith Memana

SDK 18+에는 SCREEN_ORIENTATION_LOCKED 플래그가 작동하지만 작동하는 것 같지만 모든 장치를 지원하기 위해 위의 코드를 계속 사용하고 싶습니다
DominicM

2

Visual Studio Xamarin에서 :

  1. 더하다:

using Android.Content.PM; 당신에게 활동 네임 스페이스 목록.

  1. 더하다:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

다음과 같이 클래스의 속성으로

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

이 질문은 Xamarin이 아닌 Android에 대해 묻습니다 .Android
Trevor Hart


0

현재 어떤 방법도 작동하지 않는 것 같습니다.

에서 안드로이드 스튜디오 1 간단한 방법은 추가하는 것입니다 android:screenOrientation="nosensor".

이것은 화면 방향을 효과적으로 잠급니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.