Главная » Разработка для Android » СОЗДАНИЕ ФРАГМЕНТА – программирование Android

0

 

Как и любой другой объект, фрагмент может либо входить в состав 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_time.xml (он здесь не приведен), почти как и основной вид, показанный выше.

Обращаем также ваше внимание на то, что в этом вызове inflate есть третий булев параметр, имеющий значение false. Это небольшая хитрость. Но она важна! У инфлятора должен быть доступ к container, к тому виду, который в итоге окажется родительским элементом только что созданной подсекции вида. Родительский вид необходим для правильной обработки макета. Предположим, например, что container – это RelativeLayout, указывающий положение только что созданной подсекции вида при помощи директивы Layout_toRightOf.

С другой стороны, фреймворк фрагментов владеет тем видом, который возвращается методом onCreateView, и может управлять этим видом. Код метода onCreateView должен прикреплять подсекцию вида к ее контейнеру, как это обычно происходит в процессе инфляции. Этот третий аргумент является флагом, сообщающим ин-флятору, что фреймворк фрагментов управляет ситуацией и что инфлятор не обязан прикреплять подсекцию вида к контейнеру.

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

При запуске это приложение будет выглядеть как на рис. 8.1.

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

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии