Acabei de implementar um recurso de mudança de orientação - por exemplo, quando o layout muda de retrato para paisagem (ou vice-versa). Como posso detectar quando o evento de mudança de orientação terminou.
O OrientationEventListener
não funcionou. Como posso obter notificações sobre eventos de mudança de orientação de layout?
Respostas:
Use o método onConfigurationChanged de Activity. Veja o seguinte código:
Você também tem que editar o apropriado elemento em seu arquivo de manifesto para incluir o android: configChanges Basta ver o código abaixo:
NOTA: com Android 3.2 (API de nível 13) ou superior, o "tamanho da tela" também muda quando o dispositivo alterna entre a orientação retrato e paisagem. Portanto, se você quiser evitar reinicializações de tempo de execução devido à mudança de orientação ao desenvolver para API de nível 13 ou superior, você deve declarar android: configChanges = "idance | screenSize "para API de nível 13 ou superior .
Espero que isso ajude você ... :)
fonte
Para carregar o layout na pasta layout-land significa que você tem dois layouts separados, então você tem que fazer
setContentView
noonConfigurationChanged
método.Se você tiver apenas um layout, não será necessário fazer setContentView neste método. simplesmente
fonte
onConfigurationChanged(Configuration newConfig)
método (como nesta resposta), mas em vez de manipulá-lo sozinho, defini um sinalizador booleano e chamei orecreate()
método para que o Android recriasse a atividade em seu modo normal.recreate()
método é que ele faz com que a tela pisque em preto brevemente. Por esta razão, usei outra abordagem: (1) salvar a largura da tela noonCreate(...)
, (2) comparar a largura da tela salva com a largura da tela atual em qualquer método de ciclo de vida quando a atividade estiver sendo encerrada (por exemploonSaveInstanceState(...)
).Só queria mostrar a você uma maneira de salvar todo o seu pacote após onConfigurationChanged:
Crie um novo pacote logo após a sua aula:
Em seguida, depois de "protected void onCreate" adicione isto:
Se você adicionar isso, todas as suas classes criadas em MainActivity serão salvas.
Mas a melhor maneira é adicionar isso ao seu AndroidManifest:
fonte
onConfigurationChanged()
faz com que seu instanceState não seja destruído quando a orientação muda, então você não precisa salvá-lo. Você pode querer salvá-lo para outros eventos no ciclo de vida da atividade, mas não sei.use este método
E não se esqueça de adicionar isso em seu Androidmainfest.xml
como isso
fonte
Substituir o método da atividade onConfigurationChanged
fonte
Só quero propor outra alternativa que vai preocupar alguns de vocês, de fato, conforme explicado acima:
implica que declaramos explicitamente o layout a ser injetado.
Caso queiramos manter a injeção automática graças às pastas layout-land e layout. Tudo que você precisa fazer é adicioná-lo ao onCreate:
Aqui, exibimos ou não a barra de ação dependendo da orientação do telefone
fonte
Crie uma instância de
OrientationEventListener
classe e ative-a.fonte
Se a resposta aceita não funcionar para você, certifique-se de não definir no arquivo de manifesto:
Qual é o meu caso.
fonte
No caso de ser útil para algum desenvolvedor mais recente, porque não foi especificado acima. Só para ser bem explícito:
Você precisa de duas coisas se estiver usando onConfigurationChanged :
Um
onConfigurationChanged
método em sua classe de atividadeEspecifique em seu manifesto quais mudanças de configuração serão tratadas por seu
onConfigurationChanged
métodoO snippet de manifesto nas respostas acima, embora sem dúvida correto para o aplicativo específico ao qual o manifesto pertence, NÃO é exatamente o que você precisa adicionar em seu manifesto para acionar o método onConfigurationChanged em sua classe de atividade. ou seja, a entrada do manifesto abaixo pode não ser correta para o seu aplicativo.
Na entrada de manifesto acima, há várias ações do Android para as
android:configChanges=""
quais podem acionar onCreate em seu ciclo de vida de atividade.Isso é muito importante - Os NÃO especificados no manifesto são os que acionam o seu onCreate e os especificados no manifesto são os que acionam o seu
onConfigurationChanged
método na classe de atividade.Portanto, você precisa identificar quais mudanças de configuração você precisa controlar. Para Android Encyclopedically Challenged como eu, usei as dicas rápidas pop-out no Android Studio e adicionei quase todas as opções de configuração possíveis. Listar tudo isso basicamente dizia que eu trataria de tudo e onCreate nunca seria chamado devido às configurações.
Obviamente, não quero lidar com tudo, então comecei a eliminar as opções acima, uma de cada vez. Reconstruir e testar meu aplicativo após cada remoção.
Outro ponto importante : Se houver apenas uma opção de configuração sendo tratada automaticamente que aciona seu onCreate (você não a tem listado em seu manifesto acima), então aparecerá como
onConfigurationChanged
se não estivesse funcionando. Você deve colocar todos os relevantes em seu manifesto.Eu terminei com 3 que estavam ativando onCreate originalmente, então testei em um S10 + e ainda estava recebendo o onCreate, então tive que fazer meu exercício de eliminação novamente e também precisava do
|screenSize
. Portanto, teste em uma seleção de plataformas.Minha sugestão, embora eu tenha certeza de que alguém pode abrir buracos nisso:
Adicione seu
onConfigurationChanged
método em sua classe de atividade com um TOAST ou LOG para que você possa ver quando está funcionando.Adicione todas as opções de configuração possíveis ao seu manifesto.
Confirme se seu
onConfigurationChanged
método está funcionando testando seu aplicativo.Remova cada opção de configuração de seu arquivo de manifesto, uma de cada vez, testando seu aplicativo após cada uma.
Teste na maior variedade possível de dispositivos.
Não copie / cole meu snippet acima em seu arquivo de manifesto. As atualizações do Android mudam a lista, portanto, use as dicas pop-out do Android Studio para ter certeza de obter todas elas.
Espero que isso economize algum tempo.
Meu
onConfigurationChanged
método apenas para informações abaixo.onConfigurationChanged
é chamado no ciclo de vida após a nova orientação estar disponível, mas antes que a IU seja recriada. Portanto, meu primeiroif
para verificar se a orientação funciona corretamente e, em seguida, o segundo aninhadoif
para ver a visibilidade do meu UI ImageView também funciona corretamente.fonte
para implementação Kotilin na forma mais simples - dispara apenas quando a tela muda de retrato <--> paisagem se você precisar de um dispositivo de detecção de giro (180 graus), você precisará acessar os valores do sensor de gravidade
fonte