onConfigurationChangedが呼び出されない


141

今朝、onConfigurationChangedイベントを処理しようとして問題が発生しました。問題は、電話の向きを変更しても、オーバーライドするメソッドが呼び出されないことです。まったく呼び出されません。

android:configChanges="orientation"Androidのドキュメントに記載されているように、マニフェストで定義されているアクティビティを設定しましたが、これで違いはありません。

この問題を思いつきましたか?


1
android:configChanges = "keyboardHidden"でも同じ問題が発生しています-ソフトキーボードがスライドしたりスライドしたりすると、onConfigurationChangedが呼び出されません。
Pieter Witvoet、

keyboardHiddenは、ソフトウェアキーボードではトリガーされません。Droidのスライディングキーボードのようなハードウェアキーボードでのみトリガーされます。
nmr 2012年

10
であなたは、「画面サイズ」を追加する必要がありますandroid:configChanges 。これは、Googleの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

@ Ektos974すごい!screenSizeを追加すると、onConfigurationChanged!
マヌエラ2017

こんにちは、私はTheme.Holo.Light.NoActionBarテーマを使用しています。これについては、私の活動が再開されています。再起動するアクティビティを回避する方法はありますか?
Manukumar

回答:


250

これは同じ問題の私のグレムリンでした:

注意:Android 3.2(APIレベル13)以降、デバイスが縦向きと横向きに切り替わると、「画面サイズ」も変更されます。したがって、(minSdkVersionおよびtargetSdkVersion属性で宣言されている)APIレベル13以降の開発時に方向の変更によるランタイムの再起動を防止する場合は、「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つだけです。これで全部です。+1私の側から"screenSize"です。
Anuj 2012

@philippセンサーの向きを設定するとどうなりますか?それがどのように役立つかわかりません。編集ありがとうございます。
nmr 2012

4年後、人々はまだこれに噛まれています:)
Daniel Wilson、

ありがとう。30分かけて頭を壁にぶつけた。
ラゴス

これは完璧な解決策です
Anbarasu Chinna '19

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 2011

メニフェストファイルで<activity android:name = "。MyActivity" android:screenOrientation = "landscape"> </ activity>を指定する必要があります
Qadir Hussain

3
これを使用するには(ユーザーがビデオプレーヤーで[フルスクリーン]をクリックしたonConfigChangedとき)、ユーザーが携帯電話を回転させたときにも受信を続けます。YouTubeアプリと同じ動作。これは可能ですか?
Vucko

29

デバイスの「画面の回転」設定がオンになっていることを確認してください

「画面回転」設定


7
私はこのおもしろい問題を抱えていました...:D
Dharmendra

「画面の回転」オプションがオフでもアクティビティを回転させることはできますか?はいの場合、その方法を教えてください......?当たり前のように、私の理解は機能しませんが、一部のアプリケーションはアクティビティを横向きに回転させます。
Srinivasan

1
S ** t !!! コードを機能させるために4〜5時間を費やしました。これをオーバーライドする方法は、私が別の答えから学んだように、マニフェストに<android:orientation = "sensor">を含めることです
suku

19
  1. またはレベルで使用android:screenOrientationしていないことを確認してください。ActivityApplication
  2. android:configChanges="orientation|keyboardHidden"代わりに使用してみてください。

1
android:screenOrientationを使用してonConfigurationChangedメソッドを実行したいのですが、何ができますか?thx
Bingchean

17

私はそれがうまくいかなかった理由を見つけるために数十分を費やしました。追加しましたscreenSizeが、それでも機能しませんでした。

要素ではなくandroid:configChanges<application>要素に追加したことがわかりました<activity>必要な。

もちろん、これは私の間違いでしたが、私たちは皆、この種のばかげた間違いに多くの時間を費やしていることを知っています。ですから、私のような別のばかげたプログラマがいる場合に備えて、この答えを追加します。


私も同じことをやって、おかげであなたは私の保存
Pranoyサルカールの

やあ、ありがとう!
Laurent

14

Macarseは2番目のオプションで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開発者にとって誤解を招く「修正」になるでしょう
Tobrun 2013年

@ user1281750ありがとうございます。ただし、最初のAndroid開発者として、私はあなたが正確に何を言っているのかわかりません。
aLearner 2013年

@aLearner user1281750の意味:これは実際の修正ではありません!より高いSDKバージョンが必要な場合はどうなりますか?
AgentKnopf 2013

うまくいったことを共有しました。これは「修正」ではない可能性があることを理解しています。しかし、代替案は何ですか?「正しい」解決策は何ですか?そして、「行方不明attribute: screensize」とはどういう意味ですか?詳細が提供されていると役立つ場合があります。
aLearner 2013

バディのおかげで、この解決策は私の大きな緊張を解決しました。私はこれを得るために1時間サーフィンしていた...すべての更新されたバージョンでも同様に機能しました
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

これが最適な場所かどうかはわかりませんが、この問題に遭遇したとき、私は興味深いものを見つけました。

onConfigurationChanged()リスナーが機能していない場合、方向が変更されるたびにonCreate()が再度呼び出されます。

場合onConfigurationChanged()リスナーが動作して、その方法は、代わりのonCreate()配向の変化のと呼ばれています。


これは私が見ているものですが、私はなりたくありません。そして、ドキュメントによると、それはこのように起こるべきではありません。とても混乱しています。
slycrel 2014年

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

提案のどれも私にとってはうまくいきませんでした(私はこの問題にネイティブプロジェクトを反応させました)、何時間ものデバッグの後、styles.xmlのAppThemeにこの行がある場合、

<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 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.