onConfigurationCanged çağrılmıyor


141

Bu sabah onConfigurationChangedetkinliği ele almaya çalışırken bir sorunla karşılaştım. Sorun, telefonun yönünü değiştirdiğimde, geçersiz kıldığım yöntemin çağrılmaması. Hiç aranmıyor.

android:configChanges="orientation"Android belgelerinde belirtildiği gibi manifest'te tanımlanan etkinliği koydum , ancak bu bir fark yaratmıyor.

Bu sorunu buldunuz mu?


1
Ben android için aynı sorunu yaşıyorum: configChanges = "keyboardHidden" - onConfigurationChanged, yumuşak klavye içeri veya dışarı kaydırıldığında çağrılmıyor.
Pieter Witvoet

keyboardHidden, yazılım klavyesi tarafından tetiklenmez, yalnızca Droid'deki kayar klavye gibi donanım klavyeleri tarafından tetiklenir.
nmr

10
Eğer android:configChanges google javadoc ne dedi: "screenSize" eklemeniz gerekir : 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 harika! screenSize ekleyerek onConfigurationChanged çağrılıyor!
Manuela

Merhaba, Theme.Holo.Light.NoActionBar temasını kullanıyorum. Bunun için aktivitem yeniden başlıyor. Etkinliğin yeniden başlatılmasını önlemenin bir yolu var mı?
Manukumar

Yanıtlar:


250

Bu ~ aynı sorun için benim gremlin oldu:

Dikkat: Android 3.2'den (API seviye 13) başlayarak, cihaz ekran ve yatay yön arasında geçiş yaptığında "ekran boyutu" da değişir. Bu nedenle, API düzeyi 13 veya üstü için geliştirirken (minSdkVersion ve targetSdkVersion öznitelikleri tarafından bildirildiği gibi) yön değiştirme nedeniyle çalışma zamanı yeniden başlatmalarını önlemek istiyorsanız, "yönlendirme" değerine ek olarak "screenSize" değerini de eklemeniz gerekir. Yani, android: decClare gerekir: configChanges = "orientation | screenSize". Ancak, uygulamanız API düzey 12 veya daha düşük bir sürümü hedefliyorsa, etkinliğiniz her zaman bu yapılandırma değişikliğini kendisi yapar (bu yapılandırma değişikliği, bir Android 3.2 veya daha yüksek cihazda çalışırken bile etkinliğinizi yeniden başlatmaz).

( Http://developer.android.com/guide/topics/resources/runtime-changes.html adresinden )

TL; DR: API düzeyi 13+ hedeflenirken configChanges'e "| screenSize" ekleyin


9
vay, sadece eklenecek tek bir özellik ve hepsi bu, +1benim tarafımdan "screenSize"oldu.
Anuj

@philipp Sensör yönünü ayarlamak neyi başarır? Bunun nasıl yardımcı olacağından emin değilim. Düzenleme için teşekkürler.
nmr

4 yıl sonra insanlar hala bundan ısırıldı :)
Daniel Wilson

Teşekkürler. 30 dakika, kafama duvara çarptı.
lagos

Bu mükemmel bir çözüm
Anbarasu Chinna

40

4.0'ın bazı aygıtları onConfigurationChanged öğesini çağırmaz. Sadece screenSize'a bir dinleyici ekleyin.

android:configChanges="orientation|screenSize"

Bu benim sorunumu çözdü. Nexus 7 tabletim için geçersiz kılmak onConfigurationChanged, test etmek Configuration.ORIENTATION_LANDSCAPEve SADECE android:configChanges="orientation"manifest'e dahil etmek yeterli değildi. Teşekkürler
Jantzilla

37

Sorun, bu yöntemi kullanırsanız

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Activityyönünüzü dikey moda zorlamak için orientationdeğişiklik almaya aday değilsiniz .

Dolayısıyla çözüm setRequestOrientationbelirli bir moda geçmemektir . Ama bunun yerine kullanınSCREEN_ORIENTATION_SENSOR.


5
evet, bu işe yarıyor, ama uygulamamın döndürülmesini istemezsem ne olur? manzara modunda kalmasını istiyorum.
stoefln

menifest dosyanızda <activity android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> öğesini belirtmelisiniz
Qadir Hussain

3
Bunu nasıl kullanırım (kullanıcı bir video oynatıcıda "tam ekran" ı tıkladığında) onConfigChangedve kullanıcı telefonunu döndürdüğünde de almaya devam ederim . Youtube uygulamasındaki ile aynı davranış. Bu mümkün mü?
Vucko

29

cihazınızda "Ekran döndürme" ayarının AÇIK olduğundan emin olun

"Ekran döndürme" ayarı


7
Bu komik
meselem

"Ekran döndürme" seçeneği KAPALI olsa bile etkinliği döndürmek mümkün müdür? EVET ise, lütfen bana bunu nasıl yapacağımı söyleyin ......?
Srinivasan

1
S ** t !!! Kodumu çalıştırmak için 4-5 saat geçirdim! Başka bir cevaptan öğrendiğim gibi bunu geçersiz kılmanın bir yolu, manifestte <android: orientation = "sensor"> dahil etmektir
suku

19
  1. Kullanmadığınız emin olun android:screenOrientationbir in Activityveya içinde Applicationdüzeyine.
  2. android:configChanges="orientation|keyboardHidden"Bunun yerine kullanmayı deneyin .

1
nasıl android kullanabilirsiniz: screenOrientation ve ben onConfigurationChanged yöntemi çalıştırmak istiyorum, ne yapabilirim, thx
Bingchean

17

Neden işe yaramadığını öğrenmek için onlarca dakika harcadım. Ekledim screenSizeama hala işe yaramadı.

Olması gerektiği gibi , elemana değil android:configChanges, <application>elemana eklediğim ortaya çıktı <activity>!

Tabii ki, bu benim hatamdı, ama hepimiz biliyoruz ki hepimiz bu tür saçma hata için çok zaman harcıyoruz. Bu cevabı, benim gibi aptal bir programcı olması ihtimaline karşı ekliyorum.


Ben de aynısını yapıyorum, Teşekkürler beni kurtardın
Pranoy Sarkar

Ho Teşekkürler dostum!
Laurent

14

Macarse 2. seçeneği ile% 100 para kazanıyor.

Deneyin android:configChanges="orientation|keyboardHidden|screenSize"

Aynı sorunu yaşadım ve 1.6 emülatörde rotasyon sırasında çağrılacak keyboardHiddennedenler onConfigurationChangedekledim. Çıkarın ve çağrılmasını durdurun.


5

Ben aynı problem vardı - onConfigurationChangedcihaz yönünü değiştirdi çağrılan değildi rağmen sahip android:configChanges="orientation|keyboardHidden"manifest dosyasında. DevaBurada paylaşılan kodun kodunu kullandım

oryantasyon 2.3.3'te çalışmıyor mu?

onConfigurationChangedaranıp çağrılmadığını kontrol etmek için . O değildi.

Birkaç saatlik denemeden sonra, manifest dosyasında aşağıdaki satırların olduğunu fark ettim

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

ve değiştirme hakkında android:targetSdkVersion="15"etmek android:targetSdkVersion="8", onConfigurationChangedçağrıldığını başladı. Böylece, manifestin bir kısmı nihayet böyle görünüyordu

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

9
Yaşadığınız sorun eksik öznitelik: ekran boyutu. Lütfen cevabınızı güncelleyin. Bu,
andriod

@ user1281750 Teşekkürler, ancak başlangıç ​​olarak Android geliştiricisi olarak tam olarak ne dediğinden emin değilim.
aLearner

@aLearner Kullanıcı1281750'nin ne anlama geldiğini düşünüyorum: Bu aslında bir düzeltme değil! Daha yüksek bir sdk sürümüne ihtiyacınız varsa ne olur?
AgentKnopf

Benim için işe yarayanı paylaştım. Bunun 'düzeltme' olmadığını anlıyorum. Peki alternatifi nedir? 'Doğru' çözüm nedir? Peki 'kayıp attribute: screensize' ile ne kastedilmektedir ? Daha fazla ayrıntı sağlandığında yardımcı olabilir.
aLearner

Teşekkürler dostum bu çözüm benim büyük gerginlik lol çözdü .. Bunu almak için bir saat için sörf yapıyordum ... onun da tüm güncellenmiş sürümlerinde çalışma
Sampath Kumar

3

Ben sadece eğer varsa buldum:

android:screenOrientation="landscape"

manifest'te, onConfigurationChanged () de çağrılmayacak ...

bu şuna benzer olabilir:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

bu ayar yönü onConfigurationChanged () öğesini engeller.


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

Size komplikasyon yapmak için herhangi bir hedef sdk sürümlerini kullanmayın . ve tüm API seviyeleri için bunu konfigürasyon değişikliği dinleyicisi olarak kullanın

android:configChanges="orientation|keyboardHidden|screenLayout"

3

Bu onun için en iyi yer olduğundan emin değilim, ama bu sorunla karşılaşırken - ilginç bir şey gözlemledim.

Eğer onConfigurationChanged () dinleyici çalışma DEĞİL, o onCreate () tekrar yönelim her değiştiğinde denir.

Eğer onConfigurationChanged () dinleyici çalıştığını, o zaman yöntem yerine onCreate () yönlendirme değişiklikleri olarak adlandırılır.


Gördüğüm bu - ama olmak istemiyorum. Ve belgelere göre bu şekilde olmamalı. Çok kafa karıştırıcı.
slycrel

2

Android manifest dosyasındaki tema etkinliğimi kaldırmaya çalıştığım için tüm çözümler çalışmıyor. Çok garip

<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>

Aktivitenin windowNoTitle öğesini kaldırmadan yeniden başlamasını önlemenin bir yolu var mı?
Manukumar

2

Önerilerin hiçbiri benim için işe yaramadı (yerel projeye bu sorunla tepki verdim), ancak hata ayıklama saatlerinden sonra, bu satırın styles.xml'de AppTheme'de varsa buldum

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

uygulama dönmeyecektir.


1

@ thanhbinh84 Bana neyin sebep olabileceği hakkında bir fikir verdi. Styles.xml dosyasındaki temamdan
kaldırma <item name="android:windowIsTranslucent">true</item>sorunu çözdü!


0

Ben aynı sorunu vardı ve ben hem "android: screenOrientation" hem de "android: configChanges" manifest belirtilen vardı. İlkini kaldırdığımda, onConfigurationChanged () dönüşte çağrılır. Garip ama uyandı)


1
Peki o zaman nasıl dönersin?
Mark Molina

-2

Eğer var mı android.content.res.Configurationithalat tablolara? Eclipse tuşuna basarsanız otomatik olarak içe aktarım ekleyebilir Ctrl+Shift+O.

Bu eksikse, derleyici üst sınıf yöntemini meşru olarak geçersiz kıldığınızı tanıyamaz ve bu nedenle bir hata atar.


Evet, ithalat zaten yerinde, herhangi bir fikir? çünkü herhangi bir hata ya da başka bir şey almıyorum, bu sadece çağrılmıyor.
lblasa

Bunun tüm uygulamanın dikey modda yapılıp yapılmadığıyla ilgili olup olmadığını bilmiyorum. OnConfigurationChangedEvent işlemek için gereken etkinlik, hangi mod portre olduğu bir TabHost içinde bulunan bir etkinliktir. Ama yine de, bunun o olayı yakalamak için bir sorun olduğuna dair herhangi bir yorum bulamadım. Gerçekten fikirlerim bitti.
lblasa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.