У випадку, якщо це корисно для деяких нових розробників, оскільки його не вказано вище. Просто, щоб бути дуже явним:
Якщо ви використовуєте onConfigurationChanged, вам потрібно дві речі :
onConfigurationChangedМетод у вашій діяльності класу
Вкажіть у своєму маніфесті, які зміни конфігурації будуть оброблятися вашим onConfigurationChangedметодом
Фрагмент маніфесту в наведених вище відповідях, хоча, без сумніву, правильний для конкретного додатка, до якого належить маніфест, НЕ є саме тим, що потрібно додати до маніфесту, щоб запустити метод onConfigurationChanged у вашому класі активності. тобто наведений нижче маніфест може бути невірним для вашої програми.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
У наведеному вище маніфестному документі є різні дії Android, android:configChanges=""які можуть викликати onCreate у життєвому циклі діяльності.
Це дуже важливо - ті, які НЕ вказані в маніфесті, - це ті, які запускають onCreate, і ті, які вказані в маніфесті, - це ті, які запускають ваш onConfigurationChangedметод у вашому класі активності.
Отже, вам потрібно визначити, які зміни конфігурації потрібно обробити самостійно. Для Android Encyclopedically Chellenged, як я, я використав швидкі підказки спливаючих вікон в Android Studio і додав майже в усі можливі варіанти конфігурації. Перерахувавши все це в основному говорив, що я б обробляти все, і onCreate ніколи не буде викликаний через конфігурації.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Зараз явно я не хочу впоратись із усім, тому я почав виключати описані вище варіанти один за одним. Повторне створення та тестування мого додатка після кожного видалення.
Ще один важливий момент : Якщо лише один параметр конфігурації обробляється автоматично, що запускає onCreate (у вас немає його, зазначеного у вашому маніфесті вище), то, схоже, onConfigurationChangedвін не працює. Ви повинні внести всі відповідні у свій маніфест.
Я закінчив 3, які спрацьовували onCreate спочатку, потім я протестував на S10 +, і я все ще отримував onCreate, тому мені довелося робити мою вправу усунення ще раз, і мені також потрібні були |screenSize. Тож тестуйте на підборі платформ.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Тож моя пропозиція, хоча я впевнений, що хтось може прорізати дірки в цьому:
Додайте свій onConfigurationChangedметод у свій клас активності за допомогою TOAST або LOG, щоб ви могли побачити, коли він працює.
Додайте до маніфесту всі можливі параметри конфігурації.
Перевірте, onConfigurationChangedчи працює ваш метод, перевіривши додаток.
Видаліть кожен параметр конфігурації з файлу маніфесту по одному, тестуючи додаток після кожного.
Тестуйте на якомога більшій кількості пристроїв.
Не копіюйте та не вставляйте мій фрагмент вище у файл маніфесту. Оновлення Android змінюють список, тому використовуйте підказки Android Studio, щоб переконатися, що ви все отримали.
Я сподіваюся, що це економить когось деякий час.
Мій onConfigurationChangedметод лише для інформації нижче. onConfigurationChangedвикликається в життєвому циклі після появи нової орієнтації, але до того, як інтерфейс користувача був відтворений. Отже, моя перша ifперевірка орієнтації працює правильно, а потім 2-я вкладена, ifщоб переглянути видимість мого інтерфейсу ImageView, також працює правильно.
@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);
}
}
}