В случае, если это полезно для некоторых новых разработчиков, потому что это не указано выше. Чтобы быть очень точным:
При использовании onConfigurationChanged вам понадобятся две вещи :
onConfigurationChangedМетод в вашей деятельности класса
Укажите в манифесте, какие изменения конфигурации будут обрабатываться вашим onConfigurationChangedметодом.
Фрагмент манифеста в приведенных выше ответах, хотя, несомненно, правильный для конкретного приложения, которому принадлежит манифест, это НЕ то, что вам нужно добавить в свой манифест для запуска метода onConfigurationChanged в вашем классе активности. т.е. приведенная ниже запись в манифесте может быть неправильной для вашего приложения.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
В приведенной выше записи манифеста есть различные действия Android, для android:configChanges=""которых может запускаться onCreate в жизненном цикле Activity.
Это очень важно : те, которые НЕ указаны в манифесте onConfigurationChanged, запускают ваш onCreate, а те, которые указаны в манифесте, запускают ваш метод в вашем классе активности.
Итак, вам нужно определить, какие изменения конфигурации вам нужно обработать самостоятельно. Для Android Encyclopedically Challenged, как я, я использовал всплывающие подсказки в 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проверяю правильность ориентации, а затем второй вложенный, ifчтобы посмотреть на видимость моего UI 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);
}
}
}