onConfigurationChanged가 호출되지 않음


141

오늘 아침에 나는 onConfigurationChanged이벤트 를 처리하려고하는 문제를 생각 해냈다 . 문제는 전화 방향을 변경할 때 재정의하는 메서드가 호출되지 않는다는 것입니다. 전혀 전화하지 않습니다.

나는 android:configChanges="orientation"안드로이드 문서에 언급 된 것처럼 매니페스트에 정의 된 활동을 입었지만 아무런 차이가 없습니다.

이 문제를 생각해 보셨습니까?


1
android : configChanges = "keyboardHidden"에 대해 동일한 문제가 있습니다. 소프트 키보드가 들어 오거나 꺼질 때 onConfigurationChanged가 호출되지 않습니다.
Pieter Witvoet

keyboardHidden은 소프트웨어 키보드에 의해 트리거되지 않으며 Droid의 슬라이딩 키보드와 같은 하드웨어 키보드에 의해서만 트리거됩니다.
nmr

10
당신은 "screenSize"를 추가해야합니다. android:configChanges 이것은 구글 javadoc가 말한 것입니다 : Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974

트윗 담아 가기 screenSize를 추가하면 onConfigurationChanged가 호출됩니다!
Manuela

안녕하세요, Theme.Holo.Light.NoActionBar 테마를 사용하고 있습니다. 이를 위해 내 활동이 다시 시작됩니다. 다시 시작하기 위해 활동을 피할 수있는 방법이 있습니까?
Manukumar

답변:


250

이것은 ~ 같은 문제에 대한 나의 gremlin이었습니다.

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

( http://developer.android.com/guide/topics/resources/runtime-changes.html에서 )

TL; DR : API 레벨 13 이상을 타겟팅 할 때 configChanges에 "| screenSize"추가


9
와우, 단지 하나의 속성이 추가되고 저것들 모두 +1를 저의 측면에서 보았습니다 "screenSize".
Anuj

@philipp 센서 방향을 설정하는 것은 무엇입니까? 그것이 어떻게 도움이 될지 잘 모르겠습니다. 그래도 편집 해 주셔서 감사합니다.
nmr

4 년이 지난 후에도 사람들은 여전히 ​​이것에 물렸다.
Daniel Wilson

감사. 30 분 동안 벽에 머리를 부딪쳤다.
lagos

이것은 완벽한 솔루션입니다
Anbarasu Chinna

40

4.0의 일부 장치는 onConfigurationChanged를 호출하지 않습니다. screenSize에 리스너를 추가하기 만하면됩니다.

android:configChanges="orientation|screenSize"

이것은 내 문제를 해결했습니다. Nexus 7 태블릿 에는을 재정의하고 onConfigurationChanged에 대해 테스트 하고 매니페스트 Configuration.ORIENTATION_LANDSCAPE에만 포함 android:configChanges="orientation"하는 것으로 충분하지 않았습니다. 감사합니다
Jantzilla

37

문제는이 방법을 사용하면

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

방향 Activity을 세로 모드로 설정하려는 경우 orientation변경 사항 을받을 수 없습니다 .

따라서 해결책은 setRequestOrientation특정 모드 가 아닌 것입니다. 대신에SCREEN_ORIENTATION_SENSOR.


5
예, 작동하지만 앱을 회전시키지 않으려면 어떻게해야합니까? 가로 모드로 유지하고 싶습니다.
stoefln

매니페스트 파일에 <activity android : name = ". MyActivity"android : screenOrientation = "landscape"> </ activity>를 지정해야합니다.
Qadir Hussain

3
사용자가 비디오 플레이어에서 "전체 화면"을 클릭 onConfigChanged할 때이 기능을 사용하고 사용자가 휴대 전화를 회전 할 때도 계속 수신하려면 어떻게해야합니까? YouTube 앱에서와 동일한 동작입니다. 이것이 가능합니까?
Vucko

29

기기에 "화면 회전"설정이 켜져 있는지 확인

"화면 회전"설정


7
나는 ...이 재미있는 문제를 가지고 있었다 : D
다르 멘

"화면 회전"옵션이 꺼져 있어도 활동을 회전 할 수 있습니까?. 예인 경우 어떻게해야하는지 알려주십시오 .......? 당분간 이해가 작동하지 않지만 일부 응용 프로그램은 활동을 가로로 회전시킵니다.
Srinivasan

1
성!!! 코드를 작동 시키려면 4-5 시간이 걸렸습니다! 다른 답변에서 배울 때 이것을 무시하는 방법은 매니페스트에 <android : orientation = "sensor">를 포함시키는 것입니다
suku

19
  1. 또는 레벨 에서 사용 android:screenOrientation하고 있지 않은지 확인하십시오 .ActivityApplication
  2. android:configChanges="orientation|keyboardHidden"대신 사용해보십시오 .

1
android : screenOrientation을 어떻게 사용하고 onConfigurationChanged 메소드를 실행하고 싶습니다. 어떻게해야합니까?
Bingchean

17

왜 작동하지 않는지 알아 내기 위해 수십 분을 보냈습니다. 추가 screenSize했지만 여전히 작동하지 않습니다.

내가 가진 요소가 아닌 요소에 추가 된 android:configChanges것으로 나타났습니다 !<application><activity>

물론 이것은 내 실수 였지만 우리 모두는 이런 바보 같은 실수에 많은 시간을 보낸다는 것을 알고 있습니다. 그래서 나 같은 또 다른 바보 프로그래머가 있어야하는 경우를 대비 하여이 대답을 추가하고 있습니다.


나는 또한 같은 일을하고, 덕분에 당신은 저 저장
Pranoy 사카를

호 고마워 친구!
Laurent

14

Macarse는 두 번째 옵션으로 100 % 돈을 벌고 있습니다.

시험 android:configChanges="orientation|keyboardHidden|screenSize"

정확히 같은 문제가 있었고 1.6 에뮬레이터 에서 회전 중에 keyboardHidden원인 onConfigurationChanged이 추가 되었습니다. 제거하면 호출이 중지됩니다.


5

저도 같은 문제를 겪고 - onConfigurationChanged장치가 방향을 변경할 때 호출되지 않은 에도 불구하고 가진 android:configChanges="orientation|keyboardHidden"매니페스트 파일에. Deva여기에서 공유하는 코드를 사용했습니다 .

오리엔테이션이 2.3.3에서 작동하지 않습니까?

onConfigurationChanged호출 되었는지 확인하십시오 . 아니었다.

몇 시간의 실험 끝에 매니페스트 파일에 다음 줄이 있음을 깨달았습니다.

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

및 변경에 android:targetSdkVersion="15"android:targetSdkVersion="8", onConfigurationChanged호출되는 시작했다. 따라서 매니페스트의 일부가 마침내 다음과 같이 보입니다.

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>

9
당신이 겪고있는 문제는 누락 된 속성 : screensize입니다. 답변을 업데이트하십시오. 이것은 andriod 개발자를위한 오해의 소지가있는
수정일 것

@ user1281750 감사합니다.하지만 초기 Android 개발자로서 본인이 정확히 무엇을 말하는지 잘 모르겠습니다.
aLearner

@ aLearner user1281750의 의미 : 실제로 수정은 아닙니다! 더 높은 SDK 버전이 필요한 경우 어떻게합니까?
에이전트 Knopf

나는 나를 위해 일한 것을 공유했다. 이것이 '수정'이 아닐 수도 있음을 알고 있습니다. 그러나 대안은 무엇입니까? '올바른'솔루션은 무엇입니까? 그리고 '누락 attribute: screensize'이란 무엇입니까? 자세한 내용이 제공되면 도움이 될 수 있습니다.
aLearner

고마워 친구이 솔루션은 내 큰 긴장 롤을 해결 .. 나는 이것을 얻기 위해 한 시간 동안 서핑했다 ... 그것의 모든 업데이트 된 버전에서도 작동
Sampath Kumar

3

방금 가지고 있다면 :

android:screenOrientation="landscape"

매니페스트에서 onConfigurationChanged ()도 호출되지 않습니다 ...

이것은 다음과 유사 할 수 있습니다.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

해당 설정 방향은 onConfigurationChanged ()를 차단합니다.


3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

대상 SDK 버전 을 사용하여 합병증을 일으키지 마십시오 . 모든 API 레벨에서 구성 변경 리스너로 사용하십시오.

android:configChanges="orientation|keyboardHidden|screenLayout"

3

이것이 최선의 장소인지 확실하지 않지만이 문제가 발생하면 흥미로운 것을 발견했습니다.

는 IF 의 onConfigurationChanged () 리스너가 작동하지 않는 경우, 다음에서 onCreate ()는 다시 방향이 변경 될 때마다 호출된다.

상기 중간 의 onConfigurationChanged () 수신기가 작동되어, 그 방법 대신에서 onCreate () 방향 변경 불린다.


이것이 내가보고있는 것입니다.하지만 싶지 않습니다. 그리고 문서에 따르면 이런 식으로 일어나지 않아야합니다. 혼란 스럽습니다.
slycrel 2009 년

2

모든 솔루션이 작동하지 않습니다. Android 매니페스트 파일에서 테마 활동을 제거하려고합니다. 너무 이상하다

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

windowNoTitle을 제거하지 않고 활동이 다시 시작되지 않도록하는 방법이 있습니까?
Manukumar

2

제안 사항 중 어느 것도 나를 위해 효과가 없었지만 (이 문제로 기본 프로젝트에 반응했습니다) 디버깅 시간이 지나면 AppTheme of styles.xml 에이 줄이 있으면

<item name="android:windowIsTranslucent">true</item>

앱이 회전하지 않습니다.


1

@ thanhbinh84이 문제의 원인을 알려주세요. styles.xml에서 내 테마에서
제거하면 해결 <item name="android:windowIsTranslucent">true</item>되었습니다!


0

나는 같은 문제가 있었고 매니페스트에 "android : screenOrientation"과 "android : configChanges"를 모두 지정했습니다. 첫 번째 것을 제거하면 onConfigurationChanged ()가 회전 할 때 호출됩니다. 이상하지만 깨어납니다)


1
하지만 어떻게 회전합니까?
Mark Molina

-2

당신이 가지고 android.content.res.Configuration가져 오기 문에서? 를 누르면 Eclipse가 가져 오기를 자동으로 삽입 할 수 있습니다 Ctrl+Shift+O.

이것이 없으면 컴파일러는 수퍼 클래스 메소드를 합법적으로 재정의하고 있음을 인식하지 못하므로 오류가 발생합니다.


예, 수입품은 이미 제자리에 있습니까? 오류가 발생하지 않았기 때문에 호출되지 않습니다.
lblasa

이것이 모든 응용 프로그램이 세로 모드로 만들어지고 있다는 사실과 관련이 있는지 모르겠습니다. onConfigurationChangedEvent를 처리 해야하는 활동은 모드가 세로 인 TabHost에 포함 된 활동입니다. 그러나 어쨌든, 나는이 사건을 포착하는 데 문제가되는 것에 대한 의견을 찾지 못했습니다. 나는 정말로 아이디어가 없다.
lblasa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.