Как правильно реализовать «контрол» для многократного использования?
Допустим, нужно разработать некую «читалку», которую можно использовать в других проектах.
«Читалка» представляет собой совокупность логики(кода, который пока помещен в Activity), графических файлов(разных иконок для выбора размера шрифта и т.п.), файлов ресурсов(dimens, colors, strings), xml-разметки(layout-ы, drawable, selectors, custom views).
Взаимодействие с «внешним миром»(с проектом, который ее использует) предполагалось как передача в эту Activity объекта известного типа(или объекта, реализовывающего известный интерфейс), у которого можно спросить все остальное.
Желательно, чтобы не нужно было копипастить все это дело в каждый проект и, чтобы изменив код, он менялся и в других проектах, которые его используют(т.е. чтобы проекты как бы ссылались на разработанный «контрол»). «Читалка» использует ActionBarSherlock(и, возможно, еще пару библиотек).
Реализовать в виде библиотеки? Сделать в виде фрагмента? Любые советы, даже в стиле капитана очевидности, будут полезны.
Не хватает информации:
1. Это один контрол или набор связанных контролов?
2. Каким способом вы хотите их встраивать в проект — в xml или программным образом?
3. Модель может ли изменяться извне (асинхронная загрузка, программный API)?
Если хотите распространять как библиотеку для Андроида — ваш тип сборки — apklib.
В виде фрагмента можно сделать только для удобства использования (тем кто пользуется фрагментами).
Нужно чтобы контрол мог встраиваться и без фрагемента (а это значит, что никакой логики в фрагменте быть не должно).
Предпологаю, что одним из самых правильных варинатов будет наследование от View (или ViewGroup для набора контролов), т.е. написание своей вьюхи. Далее, я бы на действия вьюхи посылал бы события на контроллер (не зависимый от GUI), который бы делал нужные действия и отсылал события (ответные) обратно на вьюху.
Для кастомизации для конкретного приложения — используйте стили (только не напрямую, а через reference, т.е. style="?some_style"), также можете предоставить набор атрибутов в xml (например, показывать/не показывать кнопку).
О создании своей View и контроллере вроде как понял. Потом эта View помещается во фрагмент, а фрагмент в Activity.
А проект, который будет использовать наработку унаследуется от этой активити или запускает ее напрямую, верно? Либо останавливаемся на View(или фрагменте) и используем ее в своей Activity. Пока не понимаю как это будет и как удобней.
О кастомизации верно подметили, она нужна. Отображать/скрывать некоторые кнопки, изменять бекграунд. На сколько я понял, то у View создаются дополнительные атрибуты и речь идет именно об этом, так же?
Да, про атрибуты именно то.
Ещё раз про View — людям которые используют, например, ActionBarSherlock или Roboguice будет НЕВОЗМОЖНО отнаследоваться от ваших активитей/фрагментов (потому что они уже наследуются от других). Поэтому крайне важно делать поставку чистой view, которая может работать с контроллером напрямую, так чтобы пользователь библиотеки не думал больше ни о чём (а, например, просто вписал бы её в layout.xml). Конечно, иногда это невозможно и нужно конфигурировать view, например, по старту активити — в этом случае добавляем метод для view init() или onActivityCreated() и пишем в доках, что такой-то метод должен быть вызван тогда-то.