Heads up: Development on this tool is winding down as view binding is stable in AS/AGP 3.6+.
- Fix: Support receiving
MotionEvent
in an@OnTouch
callback when using 'butterknife-reflect'.
Heads up: Development on this tool is winding down as view binding is stable in AS/AGP 3.6+.
- Fix: Views detached while processing click callbacks will no longer disable future clicks on other views.
Heads up: Development on this tool is winding down as view binding will be stable in AS/AGP 3.6.
- New: Make R2-generating Gradle task cacheable by default.
- Fix: R2 classes now generate their own unique values for entries. This ensures that the annotation processor
can always do a reverse mapping from ID back to name and type. In AGP 3.6.0, the
R.txt
symbol table that was previously used as a source for values now uses 0 for every entry which required this change. - Fix: Lint check for R2 values now properly handles static imports for entries.
- New: Support incremental annotation processing.
- Fix: Detect generated superclass bindings across compilation units.
- Fix: Avoid deprecated APIs from the Android Gradle plugin. As a result, the new minimum supported version of the Android Gradle plugin is 3.3.
- New: Listeners which require return values (e.g., long click) can now be bound to methods returning
void
. The default value oftrue
will be returned in this case. - New: Add support for
@OnTextChanged
and@OnPageChange
to reflection backend. - Remove enforcement of required views in the reflection backend. Most
@Nullable
annotations do not have runtime retention so they can't be checked at runtime with reflection. Instead of forcing everyone to find a new annotation, this enforcement is now dropped. While this might lead to nulls in otherwise required view bindings, they'll either be unused or quickly cause aNullPointerException
.
- Equivalent to 9.0.0 but only supports AndroidX-enabled builds.
- Removed APIs deprecated in 9.0.0.
-
New: Support for AndroidX. Requires
android.useAndroidX=true
ingradle.properties
to generate AndroidX code. -
New: A
butterknife-runtime
artifact has been extracted frombutterknife
which contains the APIs required for the generated code but does not contain the code to reflectively look up the generated code. This allows you to reference the generated code directly such that R8/ProGuard optimization can rename both the generated code and your classes.ButterKnife.bind
and the consumer R8/ProGuard rules remain in the oldbutterknife
artifact. -
New: Experimental
butterknife-reflect
artifact eliminates the need to run the annotation processor for IDE builds. This artifact is binary compatible withbutterknife
so it can be interchanged depending on how your build is being invoked. See its README for more information. Currently about 90% of functionality is covered. File bugs for anything that does not work.Note: This artifact requires Java 8. There's no good reason for this except to push the ecosystem to having this be a default. As of AGP 3.2 there is no reason not to do this.
-
New: Lint checks have been ported to UAST and now work on Kotlin code.
-
Helpers such as
apply
have been deprecated onButterKnife
and are now available on theViewCollections
class. -
Add support for Android Gradle plugin 3.3 and newer where
R
is no longer generated as Java source. This has a side-effect of removing support for Android Gradle plugin 3.0.x (and older). -
Use Java 8 bytecode for all artifacts as announced in RC1 release notes.
-
Fix: Allow
@BindFont
to work prior to API 26 usingResourcesCompat
. -
Fix: Update Android Gradle plugin to 3.1 or newer to fix binary incompatibilities.
-
Fix: Correct generated resource annotation names when running Turkish locale.
-
Fix: Use the application ID instead of the resource package for generating
R2
. -
Cache the fact that a class hierarchy has no remaining bindings to prevent traversing the hierarchy multiple times.
-
Deprecated methods from 8.x have been removed.
- Fix: Correct generated resource annotation names when running Turkish locale.
- Cache the fact that a class hierarchy has no remaining bindings to prevent traversing the hierarchy multiple times.
- Add support for Android Gradle plugin 3.3 and newer where
R
is no longer generated as Java source. This has a side-effect of removing support for Android Gradle plugin 3.0.x (and older). - Use Java 8 bytecode for all artifacts as announced in RC1 release notes.
-
New: Support for AndroidX. Requires
android.useAndroidX=true
ingradle.properties
to generate AndroidX code. -
New: A
butterknife-runtime
artifact has been extracted frombutterknife
which contains the APIs required for the generated code but does not contain the code to reflectively look up the generated code. This allows you to reference the generated code directly such that R8/ProGuard optimization can rename both the generated code and your classes.ButterKnife.bind
and the consumer R8/ProGuard rules remain in the oldbutterknife
artifact. -
New: Experimental
butterknife-reflect
artifact eliminates the need to run the annotation processor for IDE builds. This artifact is binary compatible withbutterknife
so it can be interchanged depending on how your build is being invoked. See its README for more information. Currently about 90% of functionality is covered. File bugs for anything that does not work.Note: This artifact requires Java 8. There's no good reason for this except to push the ecosystem to having this be a default. As of AGP 3.2 there is no reason not to do this.
-
New: Lint checks have been ported to UAST and now work on Kotlin code.
-
Fix: Allow
@BindFont
to work prior to API 26 usingResourcesCompat
. -
Fix: Update Android Gradle plugin to 3.1 or newer to fix binary incompatibilities.
-
Fix: Use the application ID instead of the resource package for generating
R2
. -
Deprecated methods from 8.x have been removed.
Note: The next release candidate will switch all artifacts to require Java 8 bytecode which will force your applications to enable Java 8 bytecode. As of AGP 3.2 there is no cost to this, and there is no reason to have it set any lower.
- Fix: Properly emit casts for single-bound view subtypes when
butterknife.debuggable
is set tofalse
.
- New: Processor option
butterknife.debuggable
controls whether debug information is generated. When specified asfalse
, checks for required views being non-null are elided and casts are no longer guarded with user-friendly error messages. This reduces the amount of generated code for release builds at the expense of less friendly exceptions when something breaks. - Deprecate the
findById
methods. Compile against API 26 and use the normalfindViewById
for the same functionality. - Fix: Correct
@BindFont
code generation on pre-API 26 builds to pass aContext
(not aResources
) toResourceCompat
.
- New:
@BindFont
annotation bindsTypeface
instances with an optional style. Requires support libraries 26.0.0-beta1 or newer. - New:
@BindAnim
annotation bindsAnimation
instances. - New: Generate
R2
constants for animation, layout, menu, plurals, styles, and styleables. - Fix: Properly catch and re-throw type cast exceptions when method binding arguments do not match.
- Plugin was ported to Kotlin and updated to support future Android Gradle plugin versions.
- Fix: Properly handle multiple library modules using Butter Knife and defining the same ID.
- Fix: Use the same classloader of the binding target to load the generated view binding class.
- Fix: Tweak bundled ProGuard rules to only retain the two-argument constructor accessed via reflection.
- Emit
@SuppressLint
when using@OnTouch
to avoid a lint warning. - Migrate lint checks from Lombok AST to JetBrains PSI.
- Annotations are no longer claimed by the processor.
- Based on the minimum SDK version (as specified by
butterknife.minSdk
until http://b.android.com/187527 is released) the generated code now changes to use newer APIs when available. - Generated classes now include single-argument overloads for
View
,Activity
, andDialog
subclasses. - Generated classes are no longer generic.
- Minimum supported SDK is now 9.
- New:
@BindFloat
annotation for dimensions whose format is of type 'float'. See the annotation for more information. - Generated constructors are now annotated with
@UiThread
and non-final, base classesunbind()
methods are annotated with@CallSuper
.
- New: Support for Jack compiler in application projects.
- Fix: Generate ~20% less code and ~40% less methods.
- Fix: Allow
@BindView
to reference types which are generated by other annotation processors. - Experimental: The generated view binding class can now be used directly. This allows ProGuard shrinking,
optimization, and obfuscation to work without any rules being needed. For a class
Test
, the binding class will be namedTest_ViewBinding
. Calling its constructor will bind the instance passed in, and the create object is also the implementation ofUnbinder
that can be used to unbind the views. Note: The API of this generated code is subject to backwards-incompatible changes until v9.0.
- Fix: Do not emit
android.R
imports in generated code. - Fix: Ensure the processor does not crash when scanning for
R
classes. This can occur when used in a Kotlin project.
- New: Support for library projects. Requires application of a Butter Knife Gradle plugin. See README for details.
- New: Generated code now emits
R
references instead of raw integer IDs. - Fix:
@OnPageChange
listener binding now uses the 'add'/'remove' methods onViewPager
instead of 'set'.
- New: Change the structure of generated view binders to optimize for performance and generated code. This should result in faster binding (not that it's slow) and a reduction of methods.
- Fix: Call the correct method on
TextView
to unbind@OnTextChanged
uses. - Fix: Properly handle package names which contain uppercase letters.
- Fix: ProGuard rules now prevent obfuscation of only types which reference ButterKnife annotations.
- Eliminate some of the generated machinery when referenced from
final
types.
-
@Bind
becomes@BindView
and@BindViews
(one view and multiple views, respectively). -
Calls to
bind
now return anUnbinder
instance which can be used tonull
references. This replaces theunbind
API and adds support for being able to clear listeners. -
New:
@BindArray
bindsString
,CharSequence
, andint
arrays andTypeArray
to fields. -
New:
@BindBitmap
bindsBitmap
instances from resources to fields. -
@BindDrawable
now supports atint
field which accepts a theme attribute. -
The runtime and compiler are now split into two artifacts.
compile 'com.jakewharton:butterknife:8.0.0' apt 'com.jakewharton:butterknife-compiler:8.0.0'
-
New:
apply
overloads which accept a single view and arrays of views. -
ProGuard rules now ship inside of the library and are included automatically.
-
@Optional
annotation is back to mark methods as being optional.
- Fix: Correct
ClassCastException
which occurred when@Nullable
array bindings had missing views.
@Bind
replaces@InjectView
and@InjectViews
.ButterKnife.bind
andButterKnife.unbind
replacesButterKnife.inject
andButterKnife.reset
, respectively.@Optional
has been removed. Use@Nullable
from the 'support-annotations' library, or any other annotation named "Nullable".- New: Resource binding annotations!
@BindBool
binds anR.bool
ID to aboolean
field.@BindColor
binds anR.color
ID to anint
orColorStateList
field.@BindDimen
binds anR.dimen
ID to anint
(for pixel size) orfloat
(for exact value) field.@BindDrawable
binds anR.drawable
ID to aDrawable
field.@BindInt
binds anR.int
ID to anint
field.@BindString
binds anR.string
ID to aString
field.
- Fix: Missing views will be filtered out from list and array bindings.
- Note: If you are using Proguard, the generated class name has changed from being suffixed with
$$ViewInjector
to$$ViewBinder
.
- New: Support for injecting interface types everywhere that views were previously supported (e.g.,
Checkable
). - Eliminate reflection-based method invocation for injection and resetting. This makes performance slightly faster
(although if you are worried about the performance of Butter Knife you have other problems). The only reflection
in the library is a single
Class.forName
lookup for each type.
- New: Listeners can bind to the root view being injected by omitting a view ID on the annotation.
- New: Exceptions thrown from missing views now include the human-readable ID name (e.g., 'button1').
- Specifying multiple fields binding to the same ID is now considered an error.
findById
overload for view lookup onDialog
instances.- Experimental: Click listeners are now globally debounced per frame. This means that only a single click will be processed per frame preventing race conditions due to queued input events.
- Experimental: Multiple methods can bind to the same listener provided that listener's callback method does not require a return value.
- Report an error if the annotations are on a class inside the
android.*
orjava.*
package. Since we ignore these packages in the runtime, injection would never work.
- Fix: Correct rare
ClassCastException
when unwinding anInvocationTargetException
.
- New listener!
View
:@OnTouch
.
- Fix:
@Optional
now correctly works for@InjectViews
fields. - Fix: Correct erasure problem which may have prevented the processor from running in Eclipse.
- New: Support
Dialog
as injection source. - Fix: Unwrap
InvocationTargetException
causes for more helpful exceptions.
- New:
@InjectViews
annotation groups multiple IDs into aList
or array. - New:
ButterKnife.apply
method applies anAction
,Setter
, or AndroidProperty
to views in a list. - New listeners!
ViewPager
:@OnPageChange
.AdapterView
:@OnItemSelected
.TextView
:@OnTextChanged
.
- New: Multi-method listener support. Specify a
callback
argument to choose which method the binding is for. (See@OnItemSelected
for an example) - Fix: Support for generic types which are declared with an upper-bound.
- Fix: Use less sophisticated method injection inspection in the annotation processor. The previous method caused problems with some Eclipse configurations.
- Fix: Correct a problem preventing the annotation processor to access Android types when certain
javac
configurations were used to build.
Views
class is now named ButterKnife
- New listeners!
View
:@OnLongClick
and@OnFocusChanged
.TextView
:@OnEditorAction
.AdapterView
:@OnItemClick
and@OnItemLongClick
.CompoundButton
:@OnCheckedChanged
.
- New: Views are now only checked to be
null
once if at least one of the fields and/or methods lack the@Optional
annotation. - Fix: Do no emit redundant casts to
View
for methods.
- Fix: Do not emit redundant casts to
View
.
- New: Injections are now required. An exception will be thrown if a view is
not found. Add
@Optional
annotation to suppress this verification.
- New: Control debug logging via
Views.setDebug
.
- New:
@OnClick
annotation for binding click listeners to methods!
- New:
Views.reset
for settings injections back tonull
in a fragment'sonDestroyView
callback. - Fix: Support parent class injection when the parent class has generics.
- Multiple injections of the same view ID only require a single find call.
- Fix: Ensure injection happens on classes who do not have any injections but their superclasses do.
- Fix: Parent class inflater resolution now generates correct code.
- New: Injection on objects that have zero
@InjectView
-annotated fields will no longer throw an exception.
- Fix: Prevent annotations on private classes.
- Fix: Correct generated code for parent class inflation.
- Fix: Allow injection on
protected
-scoped fields.
- Support injection on any object using an Activity as the view root.
- Support injection on views for their children.
- Fix: Annotation errors now appear on the affected field in IDEs.
- Fix: Verify that the target type extends from
View
. - Fix: Correct package name resolution in Eclipse 4.2
- Perform injection on any object by passing a view root.
- Fix: Correct naming of static inner-class injection points.
- Fix: Enforce
findById
can only be used with child classes ofView
.
Initial release.