Страницы

Поиск по вопросам

Показаны сообщения с ярлыком butterknife. Показать все сообщения
Показаны сообщения с ярлыком butterknife. Показать все сообщения

среда, 4 декабря 2019 г.

Использование ButterKnife

#java #android #аннотации #butterknife


Прочитал об аннотациях в Андроиде и наткнулся на такую либу - ButterKnife.

Какая польза от ее использования? Что она дает, кроме того, что заменяет метод findViewById?
    


Ответы

Ответ 1



Там не только Button button = (Button) findViewById(R.id.button); можно заменить на @InjectView(R.id.button) Button mButton; Но и колбеки инжектить. Скажем: button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // ... } }); превратится в: @OnClick(R.id.button) public void onButtonClick() { // ... } В адаптерах упрощается код. Если вы писали свой адаптер для ListView, то должны были писать и ViewHolder для него. Когда въюх много, то очень не красиво и не удобно в holder закидывать элементы. С помощью ButterKnife это просто: static class ViewHolder{ @InjectView(R.id.image_in_item) ImageView image; @InjectView(R.id.textview_in_item) TextView text; public ViewHolder(View view){ ButterKnife.inject(this, view); } } Если вопрос именно в том, почему именно ButterKnife, а не, скажем, RoboGuice, то он компактнее. RoboGuice тянет много зависимостей и медленнее, ибо он в рантайме, а ButterKnife во время компиляции это делает. Да и либу написал Jake Wharton. Это тот же, кто писал ActionBarSherlock и другие классные штуки. UPD: как товарищ pavlofff верно заметил, в новых версиях библиотеки @InjectView был заменен на @Bind, плюс другие изменения были. Лучше смотреть сразу в репозитории библиотеки.

понедельник, 8 июля 2019 г.

Недоступны идентификаторы элементов шаблона разметки в мультимодульном андроид-приложении c ButterKnife

Возникла проблема недоступности идентификаторов элементов шаблона разметки в мультимодульном андроид-приложении, использующем Fragment, Moxy, ButterKnife и т.д.

module_00_lib\src\main
es\layout\module_goods_toolbar.xml

module_00_lib\src\main
es\layout\module_00_fragment_recycler_list.xml




15.09.17 По подсказке добавляю код файлов скриптов сборки:
build.gradle
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' } }
allprojects { repositories { jcenter() } }
task clean(type: Delete) { delete rootProject.buildDir }
module_00_lib\build.gradle
apply plugin: 'com.android.library' apply plugin: 'com.jakewharton.butterknife'
android { compileSdkVersion 26 buildToolsVersion "26.0.1"
defaultConfig { minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
javaCompileOptions { annotationProcessorOptions { arguments = [ moxyReflectorPackage : 'com.example.module_00_lib' ] } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
def support = '26.+' def retrofit = '2.3.0' def glide = '3.7.0' def moxy = '1.5.3' def butterKnife = '8.6.0'
dependencies { compile project (':_service_lib') compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso: espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile "com.android.support:appcompat-v7:$support" compile "com.android.support:recyclerview-v7:$support" compile "com.android.support:cardview-v7:$support" compile "com.android.support:support-v4:$support" compile "com.android.support:design:$support"
compile "com.squareup.retrofit2:retrofit:$retrofit" compile "com.squareup.retrofit2:converter-gson:$retrofit"
compile "com.github.bumptech.glide:glide:$glide"
compile "com.arello-mobile:moxy:$moxy" compile "com.arello-mobile:moxy-app-compat:$moxy" annotationProcessor "com.arello-mobile:moxy-compiler:$moxy"
compile "com.jakewharton:butterknife:$butterKnife" annotationProcessor "com.jakewharton:butterknife-compiler:$butterKnife"
compile 'com.google.code.gson:gson:2.7' testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-all:1.10.19' testCompile 'org.hamcrest:hamcrest-all:1.3' testCompile 'org.robolectric:robolectric:3.1-rc1' }
При этом если отказаться от ButterKnife, то всё работает.

А в MainActivity всё работает и с ButterKnife.
Что и где нужно изменить, чтобы ButterKnife во фрагменте заработал?


Ответ

ID в библиотеках да, не final, засим их и не применить. Стандартным способом.
Но в butterKnife для сих целей есть ещё один R class c названием R2. Т.е. при использовании разметки из библиотек делайте так:
BindView(R2.id.ID)
Также, согласно README, в ваших библиотеках надо добавить плагин в скрипт сборки модуля либы:
apply plugin: 'com.android.library' apply plugin: 'com.jakewharton.butterknife'

среда, 10 октября 2018 г.

Использование ButterKnife

Прочитал об аннотациях в Андроиде и наткнулся на такую либу - ButterKnife.
Какая польза от ее использования? Что она дает, кроме того, что заменяет метод findViewById?


Ответ

Там не только
Button button = (Button) findViewById(R.id.button);
можно заменить на
@InjectView(R.id.button) Button mButton;
Но и колбеки инжектить.
Скажем:
button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // ... } });
превратится в:
@OnClick(R.id.button) public void onButtonClick() { // ... }
В адаптерах упрощается код. Если вы писали свой адаптер для ListView, то должны были писать и ViewHolder для него. Когда въюх много, то очень не красиво и не удобно в holder закидывать элементы. С помощью ButterKnife это просто:
static class ViewHolder{ @InjectView(R.id.image_in_item) ImageView image; @InjectView(R.id.textview_in_item) TextView text;
public ViewHolder(View view){ ButterKnife.inject(this, view); } }
Если вопрос именно в том, почему именно ButterKnife, а не, скажем, RoboGuice, то он компактнее. RoboGuice тянет много зависимостей и медленнее, ибо он в рантайме, а ButterKnife во время компиляции это делает.
Да и либу написал Jake Wharton. Это тот же, кто писал ActionBarSherlock и другие классные штуки.
UPD: как товарищ pavlofff верно заметил, в новых версиях библиотеки @InjectView был заменен на @Bind, плюс другие изменения были. Лучше смотреть сразу в репозитории библиотеки.