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.