onConfigurationChanged não sendo chamado

141

Esta manhã, tive um problema ao tentar lidar com o onConfigurationChangedevento. O problema é que o método, que eu substituo, não está sendo chamado quando altero a orientação do telefone. Não sendo chamado.

Eu coloquei android:configChanges="orientation"a atividade definida no manifesto, como mencionado na documentação do Android, mas isso não faz diferença.

Você veio com esse problema?

lblasa
fonte
1
Estou tendo o mesmo problema no android: configChanges = "keyboardHidden" - onConfigurationChanged não está sendo chamado quando o teclado virtual entra ou sai.
Pieter Witvoet
keyboardHidden não é acionado pelo teclado do software, apenas pelos teclados de hardware, como o teclado deslizante no Droid.
RMN
10
Você deve adicionar "screensize" em android:configChanges Isto é o que o Google javadoc disse: 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 great! adicionar screenSize é chamado onConfigurationChanged!
Manuela
Olá, estou usando o tema Theme.Holo.Light.NoActionBar. Para este, minha atividade está reiniciando. Existe alguma maneira de evitar que a atividade seja reiniciada?
precisa saber é o seguinte

Respostas:

250

Este foi o meu gremlin para o mesmo problema:

Cuidado: a partir do Android 3.2 (nível 13 da API), o "tamanho da tela" também muda quando o dispositivo alterna entre a orientação retrato e paisagem. Portanto, se você deseja impedir a reinicialização do tempo de execução devido à alteração da orientação ao desenvolver para o nível 13 da API ou superior (conforme declarado pelos atributos minSdkVersion e targetSdkVersion), inclua o valor "screenSize", além do valor da "orientação". Ou seja, você deve declarar o android: configChanges = "guidance | screenSize". No entanto, se o seu aplicativo atingir a API de nível 12 ou inferior, sua atividade sempre lida com essa alteração de configuração (ela não reinicia sua atividade, mesmo quando executada em um dispositivo Android 3.2 ou superior).

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

TL; DR: adicione "| screenSize" a configChanges ao direcionar o nível de API 13+

nmr
fonte
9
uau, apenas um único atributo a ser adicionado e maldito é tudo, +1do meu lado "screenSize"era.
anuj
@philipp Qual seria a definição da orientação para o sensor? Não tenho certeza de como isso seria útil. Obrigado pela edição embora.
RMN de
4 anos mais tarde, as pessoas ainda ser mordido por este :)
Daniel Wilson
Obrigado. Passei 30 minutos batendo minha cabeça contra a parede.
lagos
Esta é a solução perfeita
Anbarasu Chinna
40

Alguns dispositivos do 4.0 não chamam onConfigurationChanged. Apenas adicione um ouvinte ao screenSize também.

android:configChanges="orientation|screenSize"
Corbella
fonte
Isso resolveu meu problema. Substituir onConfigurationChanged, testar Configuration.ORIENTATION_LANDSCAPEe incluir APENAS android:configChanges="orientation"no manifesto não foi suficiente para o meu tablet Nexus 7. Graças
Jantzilla
37

O problema era que se você usar esse método

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

para forçar a orientação do Activitymodo retrato, você não é candidato a receber orientationalterações.

Portanto, a solução é não setRequestOrientationpara um modo específico. Mas useSCREEN_ORIENTATION_SENSOR.

lblasa
fonte
5
Sim, isso funciona, mas e se eu não quiser que meu aplicativo seja girado? Eu quero que ele fique no modo paisagem.
stoefln
você deve especificar o <atividade Android: name = "MyActivity" Android: screenOrientation = "paisagem"> </ atividade> em seu arquivo menifest
Qadir Hussain
3
Como eu uso isso (quando o usuário clica em "tela cheia" em um reprodutor de vídeo), E continuo recebendo onConfigChangedtambém quando o usuário gira o telefone. O mesmo comportamento do aplicativo do youtube. Isso é possível?
Vucko
29

verifique se o seu dispositivo está com a configuração "Rotação da tela" ativada

Configuração "Rotação da tela"

Dmitry Kolesnikovich
fonte
7
Eu tive esse problema engraçado ...: D
Dharmendra
É possível girar a atividade mesmo que a opção "Rotação da tela" esteja DESLIGADA ?. Se SIM, por favor, diga-me como fazer isso ......? De acordo com o meu entendimento, não funcionará, mas algum aplicativo alternará a atividade para a paisagem.
Srinivasan
1
S ** t !!! Passei 4-5 horas tentando fazer meu código funcionar! Uma maneira de substituir esse, como eu aprender com outra resposta é incluir <android: Orientação = "sensor"> no manifesto
suku
19
  1. Verifique se você não está usando android:screenOrientationem um Activityou em um Applicationnível.
  2. Tente usar em seu android:configChanges="orientation|keyboardHidden"lugar.
Macarse
fonte
1
Como posso usar android: screenOrientation e eu quero onConfigurationChanged método run, o que posso fazer, thx
Bingchean
17

Passei dezenas de minutos para descobrir por que não funcionou. Eu adicionei, screenSizemas ainda não funcionou.

Acabou que eu adicionei android:configChangesao <application>elemento, não ao <activity>elemento como deveria!

Bem, é claro, esse foi meu erro, mas todos sabemos que todos nós gastamos muito tempo com esse tipo de erro bobo. Então, eu estou adicionando esta resposta para o caso de haver outro programador bobo como eu.

Malditos vegetais
fonte
Eu também estou fazendo o mesmo, Graças você me salvou
Pranoy Sarkar
Ho Obrigado cara!
Laurent
14

Macarse é 100% sobre o dinheiro com sua segunda opção.

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

Eu tinha exatamente o mesmo problema e, no emulador 1.6, adicionar keyboardHiddencausas onConfigurationChangeda serem chamadas durante a rotação. Remova e ele deixa de ser chamado.

William
fonte
5

Eu tive o mesmo problema - onConfigurationChangednão foi chamado quando o dispositivo mudou de orientação apesar de ter android:configChanges="orientation|keyboardHidden"no arquivo de manifesto. Eu usei o trecho de código compartilhado por Devaaqui

orientação não está funcionando no 2.3.3?

para verificar se onConfigurationChangedestava sendo chamado. Não era.

Após algumas horas de experiência, percebi que tinha as seguintes linhas no arquivo de manifesto

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

e, ao mudar android:targetSdkVersion="15"para android:targetSdkVersion="8", onConfigurationChangedcomeçou a ser chamado. Então, parte do manifesto finalmente ficou assim

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>
aLearner
fonte
9
O problema que você está tendo é o atributo que falta: tamanho da tela. Atualize sua resposta. Esta será uma "correção" enganosa para o início desenvolvedores andriod
Tobrun
@ user1281750 Obrigado, mas como desenvolvedor Android do começo, não tenho certeza do que você está dizendo exatamente.
precisa saber é
@aLearner Acho que o que user1281750 significava: Isso não é realmente uma correção! E se você precisar de uma versão sdk superior?
AgentKnopf
Eu compartilhei o que funcionou para mim. Sei que isso pode não ser a solução ''. Mas qual é a alternativa? Qual é a solução 'certa'? E o que se entende por 'desaparecidos attribute: screensize'? Pode ser útil se mais detalhes forem fornecidos.
A5
Obrigado amigo esta solução resolveu o meu grande tensão lol .. eu estava navegando por uma hora para obter este ... o seu trabalho em todas as versões atualizadas bem
Sampath Kumar
3

Acabei de descobrir que se você tiver:

android:screenOrientation="landscape"

no manifesto, onConfigurationChanged () também não será chamado ...

isso pode ser semelhante a:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

essa orientação de configuração bloqueia o onConfigurationChanged ().

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

Não use nenhuma versão sdk de destino para torná-lo complicado. e para todos os níveis de API, use isso como ouvinte de alterações na configuração

android:configChanges="orientation|keyboardHidden|screenLayout"
Sampath Kumar
fonte
3

Não tenho certeza se este é o melhor lugar para isso, mas ao encontrar esse problema - observei algo interessante.

Se o ouvinte onConfigurationChanged () NÃO estiver funcionando, onCreate () será chamado novamente sempre que a orientação for alterada.

Se o ouvinte onConfigurationChanged () estiver funcionando, esse método será chamado em vez do onCreate () quando a orientação mudar.

Gene Bo
fonte
É isso que estou vendo - mas não quero ser. E de acordo com os documentos, isso não deveria estar acontecendo dessa maneira. Tão confuso.
slycrel
2

Todas as soluções não funcionam util. Tento remover minha atividade de tema no arquivo de manifesto do Android. Tão estranho

<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>
thanhbinh84
fonte
Existe alguma maneira de evitar que a atividade seja reiniciada sem remover o windowNoTitle?
Manukumar 30/04/19
2

Nenhuma das sugestões funcionou para mim (eu havia reagido ao projeto nativo com esse problema), mas após horas de depuração, descobri que, se você tiver essa linha no AppTheme of styles.xml

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

então o aplicativo não girará.

Matej Ukmar
fonte
1

@ thanhbinh84 Deu-me uma ideia do que poderia estar causando isso.
A remoção <item name="android:windowIsTranslucent">true</item> do meu tema no styles.xml o corrigiu!

Nitsan
fonte
0

Eu tive o mesmo problema e tive "android: screenOrientation" e "android: configChanges" especificados no manifesto. Quando removi o primeiro, onConfigurationChanged () é chamado na rotação. Estranho, mas funciona)

Misturar
fonte
1
Mas como você gira então?
Mark Molina
-2

Você recebeu android.content.res.Configurationsuas declarações de importação? O Eclipse pode inserir importações automaticamente se você pressionar Ctrl+Shift+O.

Se estiver faltando, o compilador não poderá reconhecer que você está legitimamente substituindo o método da superclasse e, portanto, gerará um erro.

Mark Mooibroek
fonte
Sim, a importação já está em vigor, alguma idéia? porque não estou recebendo nenhum erro ou qualquer coisa, é só que não está sendo chamado.
Lblasa
Não sei se isso pode estar relacionado ao fato de todo o aplicativo estar sendo feito no modo retrato. A atividade na qual eu preciso lidar com o onConfigurationChangedEvent é uma atividade contida em um TabHost cujo modo é retrato. De qualquer forma, não encontrei nenhum comentário sobre esse problema para capturar esse evento. Estou realmente sem idéias.
Lblasa