Android, 장치를 회전 할 때 활동을 파괴하지 않는 방법은 무엇입니까?


81

세로 모드에서만 작동하는 앱이 있으며 모든 활동에 대해 매니페스트 파일에서 방향을 세로로 변경했습니다. 그러나 장치를 회전하면 활동이 다시 생성됩니다. 활동을 파괴하지 않는 방법?


1
이것은 종종 권장되지 않으며, 다음과 같이 프로그래밍 방식으로 응용 프로그램 방향을 설정해 볼 수 있습니다. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
stealthcopter

7
왜 반대할까요? 실행하는 데 2 ​​초가 걸리는 서비스가 있다고 가정 해 보겠습니다. 활동이 매번 파괴되면 해당 서비스는 매번 계속 실행되지만 한 번만 실행하면됩니다.
Mohamed Mansour

답변:


131

대한 API 12 이하 : 추가

android:configChanges="orientation"

방향이 변경 될 때마다 화면 크기도 변경되므로 API 13 이상을 대상으로하는 경우 "screenSize"를 추가하십시오 . 그렇지 않으면 새 장치가 계속해서 활동을 파괴합니다. "screenSize"사용에 대한 자세한 내용은 아래 Egg의 답변을 참조하십시오.

android:configChanges="orientation|screenSize"

AndroidManifest.xml의 활동에. 이렇게하면 활동이 자동으로 다시 시작되지 않습니다. 자세한 내용 은 설명서 를 참조하십시오 .


활동이 다시 시작됩니다. 가상으로 회전하지 않더라도 활동이 회전 할 때 수행해야하는 모든 작업을 수행하는 것이 무슨 의미인지 모르겠습니다. 이 문제를 근본적으로 해결하기 위해 센서가 회전에 대해 OS에 보내는 메시지를 비활성화하는 방법이 있습니까?
Vasil

6
어떤 장치에서 프로그래밍하고 있습니까? 예를 들어 키보드를 밀어 내면 활동이 다시 시작될 수 있습니다 ... (그것이 이유 인 경우 confChanges를 "keyboard | keyboardHidden | orientation"으로 설정)

2
이렇게하면 레이아웃 변경이 비활성화됩니다. 어떻게 수정합니까?
Remian8985

1
이 솔루션은 파괴 및 생성 활동을 해결하지만 레이아웃 변경을 처리하는 방법입니다. 방향을 변경할 때 해당 레이아웃을로드하는 것을 의미합니다.
sandeepmaaram

매니페스트 파일과 반대로 android : configChanges 매개 변수를 프로그래밍 방식으로 설정하는 방법이 있습니까?
CodyF

108

공식 문서에서 flurin은 말했습니다,

참고 : 애플리케이션이 API 레벨 13 이상을 대상으로하는 경우 (minSdkVersion 및 targetSdkVersion 속성에 의해 선언 된대로) 'screenSize'구성도 선언해야합니다. 기기가 세로 방향과 가로 방향 사이를 전환 할 때도 변경되기 때문입니다.

따라서 앱이 API 레벨 13 이상을 대상으로하는 경우 대신이 구성을 설정해야합니다.

android:configChanges="orientation|screenSize"


4
정말 고맙습니다! 다른 모든 답변은 API 레벨 13 이이 screenSize를 도입하는 부분을 놓칩니다. 당신은 내 생명을 구했습니다! :)
Tamás Barta 2012

1
@egg 감사합니다. :) 이것은 도움이되었습니다!
KarenAnne

1
파트 타임으로 할 때 문서를 따라 가기가 어렵습니다.
wallerjake

1
+1 좋은 터치 맨. 이 솔루션을 공유해 주셔서 감사합니다. 당신은 내 하루를 구했습니다. 감사합니다;)
사이먼 Dorociak

9

올바른 솔루션은

android:configChanges="orientation|screenSize"

Android 문서 :

현재 사용 가능한 화면 크기가 변경되었습니다. 이것은 현재 가로 세로 비율에 비해 현재 사용 가능한 크기의 변경을 나타내므로 사용자가 가로와 세로 사이를 전환 할 때 변경됩니다. 그러나 애플리케이션이 API 레벨 12 이하를 대상으로하는 경우 활동은 항상이 구성 변경을 자체적으로 처리합니다 (이 구성 변경은 Android 3.2 이상 기기에서 실행되는 경우에도 활동을 다시 시작하지 않음). *


5

나는 이것을 조금 엉망으로 만든 다음 Manifest 파일 내에서 configChanges를 활동 수준이 아닌 응용 프로그램 수준에 두었다는 사실을 알 렸습니다. 다음은 코드가 올바르게 작동 할 때의 모습입니다.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 

2
이미지 대신 게시물 내에서 코드를 공유해야합니다.
Jules Dupont

제발 편집 게시물을 텍스트 대신 스크린 샷과 실제 매니페스트 코드를 보여줍니다. 다른 사용자는 이미지에서 복사하여 붙여 넣을 수 없습니다. 자세한 내용은 여기참조하십시오 . 감사합니다.
Pang

1

이제 Android가 분할 화면 (Android 용어로 "다중 창")을 지원하므로 screenSize | smallestScreenSize | screenLayout | orientation도 추가 할 수 있습니다. 따라서 회전 및 분할 화면을 처리하려면 android : configChanges에서 다음과 같은 것을 원할 것입니다.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>


-1

매니페스트에 작성하십시오.

android:configChanges="orientation|screenSize|keyboardHidden"

문제를 해결 한 활동에서 이것을 재정의하십시오.

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

5
onConfigurationChanged 메서드를 재정의하고 원래 구현을 호출하여 유용한 작업을 수행하는 이유는 무엇입니까?
ricosrealm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.