Thursday, June 30, 2011

Honeycomb App Widget and Backwards Compatibility

Honeycomb added some neat functionality to Android widgets. However, there's a problem that arises from adding a widget using collections to your app - what if your APK is supposed to work on all versions of Android? How do you prevent the Honeycomb-only widget from appearing in previous versions?

Normally when you want to do something different between versions of Android, you either use resource qualifiers (for XML) or check Build (for code). But in this case, the widget itself is defined in AndroidManifest.xml, which can only be at the root of your project.

There's a way of removing the app widget from the listing in previous versions: use resource qualifiers on the AppWidgetProviderInfo resource.

When you define an app widget in AndroidManifest.xml, you must also define a <meta-data> element which points towards the AppWidgetProviderInfo (that is usually contained inside of a file in /res/xml/). Simply move that provider file to a directory that only Honeycomb can see - /res/xml-v11/. Earlier versions of Android will try to load the widget only to find no AppWidgetProviderInfo and will thus ignore the widget.

UDPATE (Jan 26th, 2012): I've now written about an improved solution to this problem.


  1. That's res/xml-v11/, not res/xml-api11/.

  2. Whoops! Don't know what I was thinking when I typed that out. Fixed now.

  3. This is a great tip - surprised more people haven't said that. This just isn't documented anywhere else!

    What I'd *really* like to see is some documentation on using pre-3.0 features, such as a listview, in a widget on Android 2.3