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?


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+


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"

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.


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"


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.

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.


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.


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

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 ().


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"

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.


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

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


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!


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)


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.