What is the main purpose of such methods as setTag()
and getTag()
of View
type objects?
Am I right in thinking that I can ass
I'd like to add few words.
Although using get/setTag(Object)
seems to be very useful in the particular case of a ViewHolder pattern, I'd recommend to think twice before using it in other cases. There is almost always another solution with better design.
The main reason is that code like that becomes unsupportable pretty quickly.
It is non-obvious for other developers what you designed to store as tag in the view. The methods setTag/getTag
are not descriptive at all.
It just stores an Object
, which requires to be cast when you want to getTag
. You can get unexpected crashes later when you decide to change the type of stored object in the tag.
Here's a real-life story: We had a pretty big project with a lot of adapters, async operations with views and so on. One developer decided to set/getTag
in his part of code, but another one had already set the tag to this view. In the end, someone couldn't find his own tag and was very confused. It cost us several hours to find the bug.
setTag(int key, Object tag)
looks much better, cause you can generate unique keys for every tag (using id resources), but there is a significant restriction for Android < 4.0. From Lint docs:
Prior to Android 4.0, the implementation of View.setTag(int, Object) would store the objects in a static map, where the values were strongly referenced. This means that if the object contains any references pointing back to the context, the context (which points to pretty much everything else) will leak. If you pass a view, the view provides a reference to the context that created it. Similarly, view holders typically contain a view, and cursors are sometimes also associated with views.