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 onConfigurationChangedmétodo em sua classe de atividade
Especifique em seu manifesto quais mudanças de configuração serão tratadas por seu onConfigurationChangedmétodo
O 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.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
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 onConfigurationChangedmé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.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
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 onConfigurationChangedse 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.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Minha sugestão, embora eu tenha certeza de que alguém pode abrir buracos nisso:
Adicione seu onConfigurationChangedmé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 onConfigurationChangedmé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 onConfigurationChangedmé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 primeiro ifpara verificar se a orientação funciona corretamente e, em seguida, o segundo aninhado ifpara ver a visibilidade do meu UI ImageView também funciona corretamente.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
}
}