1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lizhengxian-MyButterKnife

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Реализация собственного BindView: аналог ButterKnife

Появление плагина ButterKnife освободило Android-разработчиков от утомительного повторяющегося кода findViewById. Особенно это полезно в сочетании с различными плагинами для автоматической генерации кода в Android Studio.

Принцип работы ButterKnife, вероятно, известен всем. Он использует AbstractProcess для автоматического создания кода findViewById для аннотации BindView во время компиляции. Метод ButterKnife#bind(Activity) по существу вызывает автоматически сгенерированный код findViewById.

Однако когда мне потребовалось разобраться в этих деталях реализации, я решил изучить исходный код ButterKnife. Проект ButterKnife включает множество аннотаций, и изучение их может занять некоторое время. Основываясь на своём опыте работы над этим проектом, я создал собственную аннотацию BindView, чтобы помочь другим лучше понять процесс.

Ссылка на GitHub

Мой проект уже загружен на GitHub, и я приглашаю всех желающих поставить ему «звёздочку». Нажмите здесь, чтобы увидеть MyButterKnife.

Структура проекта

  • Annotation module Здесь объявлена наша аннотация BindView. Она имеет тип FIELD и политику хранения CLASS. Это означает, что она используется для объявления атрибутов внутри класса и действует во время компиляции, а не во время выполнения. Если бы политика хранения была RUNTIME, то это могло бы привести к снижению производительности из-за использования отражения. Значение int в аннотации BindView соответствует типу R.id, что позволяет нам напрямую связывать View с его идентификатором:
@BindView(R.id.btn)
protected Button mBtn;
  • Compiler module Этот модуль является ключевым для автоматической генерации кода findViewById. Здесь есть только один класс, который наследуется от AbstractProcessor.
@AutoService(Processor.class)
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class BindProcess extends AbstractProcessor{
    private Elements mElementsUtil;

    /**
     * key:     enclosed elemnt
     * value:   inner views with BindView annotation
     */
    private Map<TypeElement,Set<Element>> mElems;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        mElementsUtil = processingEnv.getElementUtils();
        mElems = new HashMap<>();
    }

    // ...
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/lizhengxian-MyButterKnife.git
git@api.gitlife.ru:oschina-mirror/lizhengxian-MyButterKnife.git
oschina-mirror
lizhengxian-MyButterKnife
lizhengxian-MyButterKnife
master