СТВОРЕННЯ фрагменті – програмування Android

&nbsp

Як і будь-який інший обєкт, фрагмент може або входити до складу XML-визначення макета, або додаватися в вигляд за допомогою програмування У макеті фрагмент виглядає так:

Зараз такий код вже, ймовірно, здається знайомим Єдиний новий елемент у файлі mai n xml – це тег fragment Тег використовує атрибут cl ass для вказівки повністю кваліфікованого імені того класу, який реалізує фрагмент На клас реалізації фрагмента накладається ряд умов Дана конкретна реалізація класу – com oreilly demo android ch085 contactViewer DateTime, а умови такі: О повинен існувати клас з точно таким же імям, яке вказано Цей клас повинен бути бачимо з додатка

іменований клас повинен бути підкласом від Fragment

Хоча обидва цих моменту цілком можна перевірити статично, поточні інструменти Android цього не роблять Доведеться перевірити виконуваність обох умов вручну

Фреймворк Android створює новий екземпляр іменованого класу в процесі інфляції шаблону Така ситуація передбачає незвичайні передумови Це означає, що у класу повинен бути безаргументний конструктор Такий конструктор в мові Java надається за замовчуванням У документації з розробки для Android рекомендується (причому настійно) не визначати ніяких конструкторів в будь-яких підкласах Fragment, оскільки новоявлений обєкт Fragment у момент створення може не мати узгодженого стану (consistent state) У документації зазначено, що ініціалізацію фрагмента краще проводити пізніше в життєвому циклі фрагмента

Незалежно від того, як ви використовуєте фрагмент де-небудь у додатку, діє правило: якщо ви використовуєте його в макеті, то повинна бути можливість створити його в процесі інфляції, що не повідомляючи при цьому параметри ініціалізації Крім того, фрагмент, створюваний таким чином, повинен бути готовий для якої-небудь корисної роботи навіть без ініціалізації Наприклад, фрагмент, що відображає контент з переданого URL, повинен мати можливість обробляти ситуацію, в якій і URL – і, отже, контент – порожній

Ось, наприклад, дуже простий фрагмент:

У цьому коді показано кілька дуже важливих моментів Саме існування методу onCreate, що відноситься до життєвого циклу, має нагадувати про клас Activity і методах його життєвого циклу Хоча життєвий цикл Fragment не ідентичний життєвому циклу Actіvity, у них досить багато загальних методів Як і при роботі з актинії, метод фрагмента onCreate викликається при ініціалізації цього фрагмента Саме тут найкраще проводити ініціалізацію, яку ми відклали при роботі з конструктором Приклад гарантує, що значення змінної time (саме її відображенням і займатиметься фрагмент) буде правильно ініціалізувати

У фрагментів є кілька додаткових методів життєвого циклу, в тому числі onCreateView, який також використовується в даному прикладі Метод onCreateView викликається при ініціалізації виду фрагмента (На відміну від onCreate, який викликається, коли инициализируется сам фрагмент) Зверніть увагу: фрагмент створює вигляд, яким управлятиме, використовуючи переданий LayoutInflater для інстанцірованія підсекції виду (view shard) R Layout datetime Проста підсекція виду – що складається всього лише з пари TextViews в RelativeLayout – визначається у власному файлі layout / date_timexml (він тут не наведено), майже як і основний вид, показаний вище

Звертаємо також вашу увагу на те, що в цьому виклику inflate є третій булевий параметр, що має значення false Це невелика хитрість Але вона важлива У інфлятора повинен бути доступ до container, до того увазі, який в підсумку виявиться батьківським елементом щойно створеної підсекції виду Батьківський вид необхідний для правильної обробки макета Припустимо, наприклад, що container – це RelativeLayout, який вказує положення щойно створеної підсекції вигляду за допомогою директиви Layout_toRightOf

З іншого боку, фреймворк фрагментів володіє тим видом, який повертається методом onCreateView, і може керувати цим видом Код методу onCreateView повинен прикріплювати підсекцію виду до її контейнеру, як це зазвичай відбувається в процесі інфляції Цей третій аргумент є прапором, сообщающим ін-флятору, що фреймворк фрагментів керує ситуацією і що инфлятор не зобовязаний прикріплювати підсекцію виду до контейнера

Після того як підсекція виду буде створена, метод findViewByld можна буде використовувати для знаходження інших, вкладених віджетів У даному прикладі ми знайдемо Text View, в якому відображається час, і поставимо в підсекцію виду значення змінної time, ініціалізованої в onCreate

При запуску цей додаток буде виглядати як на рис 81

Рис 81 Простий фрагмент

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*