Für den Fall, dass dies für einige neuere Entwickler von Nutzen ist, da es oben nicht angegeben ist. Nur um ganz explizit zu sein:
Sie benötigen zwei Dinge, wenn Sie onConfigurationChanged verwenden :
Eine onConfigurationChangedMethode in Ihrer Aktivitätsklasse
Geben Sie in Ihrem Manifest an, welche Konfigurationsänderungen von Ihrer onConfigurationChangedMethode behandelt werden
Das Manifest-Snippet in den obigen Antworten ist zwar zweifellos für die jeweilige App, zu der das Manifest gehört, korrekt, aber NICHT genau das, was Sie in Ihr Manifest einfügen müssen, um die onConfigurationChanged-Methode in Ihrer Aktivitätsklasse auszulösen. Das heißt, der folgende Manifesteintrag ist möglicherweise nicht korrekt für Ihre App.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
Im obigen Manifesteintrag gibt es verschiedene Android-Aktionen, für android:configChanges=""die onCreate in Ihrem Aktivitätslebenszyklus ausgelöst werden kann.
Dies ist sehr wichtig - Diejenigen, die NICHT im Manifest angegeben sind, lösen Ihr onCreate aus, und diejenigen, die im Manifest angegeben sind, lösen Ihre onConfigurationChangedMethode in Ihrer Aktivitätsklasse aus.
Sie müssen also ermitteln, welche Konfigurationsänderungen Sie selbst vornehmen müssen. Für Android Encyclopedically Challenged wie mich habe ich das Popup mit schnellen Hinweisen in Android Studio verwendet und fast jede mögliche Konfigurationsoption hinzugefügt. Das Auflisten all dieser Elemente hat im Grunde gesagt, dass ich alles erledigen würde und onCreate aufgrund von Konfigurationen niemals aufgerufen wird.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Jetzt möchte ich natürlich nicht alles erledigen, also habe ich begonnen, die oben genannten Optionen einzeln zu eliminieren. Nach jedem Entfernen meine App neu erstellen und testen.
Ein weiterer wichtiger Punkt : Wenn nur eine Konfigurationsoption automatisch behandelt wird, die Ihr onCreate auslöst (Sie haben es oben in Ihrem Manifest nicht aufgeführt), scheint onConfigurationChangedes nicht zu funktionieren. Sie müssen alle relevanten in Ihr Manifest aufnehmen.
Am Ende hatte ich 3, die ursprünglich onCreate auslösten, dann habe ich auf einem S10 + getestet und ich bekam immer noch onCreate, also musste ich meine Eliminierungsübung erneut machen und ich brauchte auch das |screenSize. Testen Sie also auf einer Auswahl von Plattformen.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Also mein Vorschlag, obwohl ich sicher bin, dass jemand Löcher in diese stechen kann:
Fügen Sie Ihre onConfigurationChangedMethode in Ihrer Aktivitätsklasse mit einem TOAST oder LOG hinzu, damit Sie sehen können, wann sie funktioniert.
Fügen Sie Ihrem Manifest alle möglichen Konfigurationsoptionen hinzu.
Bestätigen Sie, dass Ihre onConfigurationChangedMethode funktioniert, indem Sie Ihre App testen.
Entfernen Sie jede Konfigurationsoption einzeln aus Ihrer Manifestdatei und testen Sie anschließend Ihre App.
Testen Sie auf möglichst vielen Geräten.
Kopieren Sie meinen obigen Ausschnitt nicht in Ihre Manifestdatei. Android-Updates ändern die Liste. Verwenden Sie daher die Pop-out-Hinweise für Android Studio, um sicherzustellen, dass Sie alle erhalten.
Ich hoffe das spart jemandem etwas Zeit.
Meine onConfigurationChangedMethode nur zur Info unten. onConfigurationChangedwird im Lebenszyklus aufgerufen, nachdem die neue Ausrichtung verfügbar ist, aber bevor die Benutzeroberfläche neu erstellt wurde. Daher iffunktioniert meine erste Überprüfung der Ausrichtung korrekt, und die zweite, die verschachtelt ist if, um die Sichtbarkeit meiner UI ImageView zu überprüfen, funktioniert ebenfalls korrekt.
@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);
}
}
}