Nel caso in cui questo sia utile per alcuni sviluppatori più recenti perché non è specificato sopra. Giusto per essere molto espliciti:
Hai bisogno di due cose se usi onConfigurationChanged :
Un onConfigurationChangedmetodo nella tua classe di attività
Specifica nel tuo manifest quali modifiche alla configurazione verranno gestite dal tuo onConfigurationChangedmetodo
Lo snippet di manifest nelle risposte precedenti, sebbene senza dubbio corretto per la particolare app a cui appartiene il manifest, NON è esattamente ciò che devi aggiungere nel tuo manifest per attivare il metodo onConfigurationChanged nella tua Activity Class. ad esempio, la voce di manifest di seguito potrebbe non essere corretta per la tua app.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
Nella voce manifest sopra, ci sono varie azioni Android per android:configChanges="" quali è possibile attivare onCreate nel ciclo di vita delle attività.
Questo è molto importante: quelli NON specificati nel manifest sono quelli che attivano il tuo onCreate e quelli specificati nel manifest sono quelli che attivano il tuo onConfigurationChangedmetodo nella tua Activity Class.
Quindi è necessario identificare quali modifiche alla configurazione è necessario gestire da soli. Per Android Encyclopedically Challenged come me, ho utilizzato il pop-out dei suggerimenti rapidi in Android Studio e aggiunto in quasi tutte le possibili opzioni di configurazione. L'elenco di tutti questi fondamentalmente diceva che avrei gestito tutto e onCreate non verrà mai chiamato a causa delle configurazioni.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Ora ovviamente non voglio gestire tutto, quindi ho iniziato a eliminare le opzioni di cui sopra una alla volta. Ricostruzione e test della mia app dopo ogni rimozione.
Un altro punto importante : se c'è solo un'opzione di configurazione gestita automaticamente che attiva il tuo onCreate (non l'hai elencato nel tuo manifest sopra), allora apparirà comeonConfigurationChanged . Devi inserire tutti quelli rilevanti nel tuo manifest.
Ho finito con 3 che si stavano attivando originariamente su onCreate, poi ho provato su un S10 + e stavo ancora ricevendo onCreate, quindi ho dovuto ripetere il mio esercizio di eliminazione e avevo anche bisogno di |screenSize. Quindi prova su una selezione di piattaforme.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Quindi il mio suggerimento, anche se sono sicuro che qualcuno possa fare dei buchi in questo:
Aggiungi il tuo onConfigurationChangedmetodo nella tua classe di attività con un TOAST o LOG in modo da poter vedere quando funziona.
Aggiungi tutte le opzioni di configurazione possibili al tuo manifest.
Conferma che il tuo onConfigurationChangedmetodo funziona testando la tua app.
Rimuovi ogni opzione di configurazione dal tuo file manifest una alla volta, testando la tua app dopo ciascuna.
Prova su una varietà di dispositivi più ampia possibile.
Non copiare / incollare il mio snippet sopra nel tuo file manifest. Gli aggiornamenti Android cambiano l'elenco, quindi utilizza i suggerimenti di Android Studio pop-out per assicurarti di averli tutti.
Spero che questo faccia risparmiare tempo a qualcuno.
Il mio onConfigurationChangedmetodo solo per le informazioni di seguito. onConfigurationChangedviene chiamato nel ciclo di vita dopo che il nuovo orientamento è disponibile, ma prima che l'interfaccia utente sia stata ricreata. Quindi il mio primo ifcontrollo che l'orientamento funzioni correttamente, quindi il secondo annidato ifper esaminare la visibilità della mia interfaccia utente ImageView funziona correttamente.
@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);
}
}
}