- •Використання LogCat
- •Повороти і життєвий цикл активності
- •Конфігурації пристроїв і альтернативні ресурси
- •Створення макету для альбомної орієнтації
- •Збереження даних між поворотами
- •Перевизначення onSaveInstanceState(Bundle)
- •Знову про життєвий цикл Activity
- •Контрольні запитання
- •Виконання(додаток мабуть і знаходиться на передньому плані)
- •Для допитливих: тестування onSaveInstanceState(Bundle)
Повороти і життєвий цикл активності
А тепер повернемося до помилки, виявленої у лабораторній роботі №2. Запустіть GeoQuiz, натисніть кнопку Next для переходу до наступного питання, а потім поверніть пристрій. (Щоб імітувати поворот в емуляторі, натисніть Control+F12/Ctrl+F12).
Після повороту GeoQuiz знову виводить перше питання. Щоб зрозуміти, чому це сталося, проглянете виведення LogCat.
Мал. 3.10. QuizActivity помирає і відроджується
Колі ви повертаєте пристрій, екземпляр QuizActivity, який ви бачили, знищується, і замість нього створюється новий екземпляр. Знову поверніть пристрій — відбувається ще один цикл знищення і відродження.
Через це і виникає помилка. При кожному створенні нового екземпляра QuizAc - tivity змінна mCurrentIndex ініціалізувалася 0, а користувач розпочинає з першого питання. Незабаром ми виправимо помилку, але спочатку уважніше розберемося, чому це відбувається.
Конфігурації пристроїв і альтернативні ресурси
Поворот призводить до зміни конфігурації пристрою. Конфігурація пристрою є набором характеристик, що описують поточний стан конкретного пристрою. До числа характеристик, що визначають конфігурацію
відноситься орієнтація екрану, щільність пікселів, розмір екрану, тип клавіатури, режим стикування, мова і багато що інше.
Як правило, додатки надають альтернативні ресурси для різних конфігурацій пристроїв. Приклад такого роду нам вже зустрічався — згадаєте, як ми включали в проект декілька зображень стрілки для різної щільності пікселів.
Щільність пікселів є фіксованим компонентом конфігурації пристрою; вона не може змінитися під час виконання. Навпаки, деякі компоненти(такі, як орієнтація) можуть змінюватися при виконанні.
При зміні конфігурації під час виконання може виявитися, що додаток містить ресурси, краще відповідні для нової конфігурації. Щоб побачити, як працює цей механізм, ми створимо альтернативний ресурс, який Android знайде і використає при зміні орієнтації екрану.
Створення макету для альбомної орієнтації
Згорніть панель LogCat. (Якщо замість цього ви випадково закриєте панель LogCat, її завжди можна відкрити наново командою Window - Show View...)
Потім на панелі Package Explorer клацніть правою кнопкою миші на каталозі res і створіть нову теку. Присвойте їй ім'я layout - land.
Мал. 3.11. Створення нової теки
Скопіюйте файл activity _ quiz.xml з res/layout/ в res/layout - land/. Тепер в додатку є два макети: макет для альбомної орієнтації і макет за умовчанням. Залиште ім'я файлу без зміни. Два файли макетів повинні мати однакові імена, щоб на них можна було посилатися по одному ідентифікатору ресурсу.
Суфікс — land — ще один приклад конфігураційного кваліфікатора. По конфігураційних кваліфікаторах підкаталогів res Android визначає, які ресурси краще всього підходять для поточної конфігурації пристрою. Список конфігураційних кваліфікаторів, підтримуваних Android, і компонентів конфігурації пристроїв, що означають ними, знаходиться за адресою http://developer. android.com/guide/topics/resources/providing-resources.html. Ми повернемося до використання конфігураційних кваліфікаторів в главі 15.
Коли пристрій знаходиться в альбомній орієнтації, Android знаходить і використовує ресурси в каталозі res/layout - land. Інакше використовуються ресурси за умовчанням з каталогу res/layout/.
Внесемо деякі зміни в альбомний макет, щоб він відрізнявся від макету за умовчанням. Зведення цих змін представлене на мал. 3.12.
Мал. 3.12. Альтернативний макет для альбомної орієнтації
Замість LinearLayout використовуватиметься FrameLayout — простий різновид ViewGroup без певного способу розміщення нащадків. У цьому макеті дочірні представлення розміщуватимуться відповідно до атрибуту
android: layout _ gravity.
Атрибут android : layout _ gravity потрібний віджетам TextView, LinearLayout
і Button. Нащадки Button віджета LinearLayout залишаються без змін.
Відкрийте файл layout - land/activity _ quiz.xml і внесіть необхідні зміни, керуючись мал. 3.12. Перевірте результат своєї роботи по лістингу 3.4.
Лістинг 3.4. Налаштування альбомного макету(layout - land/activity _ quiz.xml)
Знову запустите GeoQuiz. Поверніть пристрій в альбомну орієнтацію, щоб побачити новий макет. Звичайно, в програмі використовується не лише новий макет, але і новий екземпляр QuizActivity.
Поверніть пристрій, щоб перемкнутися в книжкову орієнтацію. Ви побачите новий макет — і новий екземпляр QuizActivity.
Android вибирає найбільш відповідний ресурс за вас, але для цього він створює нову активність «з нуля». Щоб клас QuizActivity вивів новий макет, необхідно знову викликати метод setContentView(R.layout.activity _ quiz). А це не станеться без повторного виклику QuizActivity.onCreate(.). Відповідно
Android при повороті знищує поточний екземпляр QuizActivity і починає все наново, щоб забезпечити оптимальний підбір ресурсів для нової конфігурації.
Мал. 3.13. QuizActivity в альбомній орієнтації
Врахуйте, що Android знищує поточну активність і створює нову при кожній зміні конфігурації часу виконання. Також під час виконання можуть відбувається і інші зміни(наприклад, зміна мови або доступності клавіатури), але зміна в орієнтації екрану є найчастішою.
