Скрыть виджет приложения в зависимости от уровня API

Я создал три виджета приложений с разными размерами для предыдущих версий Honecomb Android и один изменяемый размер прокручиваемого виджета listview для Honeycomb и позже.

Поскольку виджеты предлагают ту же функциональность, и та, которая предназначена для Honeycomb, а затем изменяет размер, я хотел бы удалить другие версии виджета на уровне API 12 или более поздней версии. Возможно ли это как-то?

Насколько я могу судить, не существует способа отключить виджет от регистрации в AppWidgetService, если он может найти файл ресурсов AppWidgetProviderInfo. Похоже, что я могу включать только виджеты в более поздние версии, но не исключать версии, определенные в папках xml, ориентированных на более ранние версии API.

Ответ 1

Если бы это был единственный виджет приложения, который имел реализации до HC или HC, вы могли бы объединить их в один AppWidgetProvider и использовать res/xml-v11/ и res/xml/ для разных метаданных.

Единственный способ, с помощью которого я могу работать с вашим сценарием, - это отметить часть AppWidgetProviders как отключенную в манифесте (android:enabled="false"), а затем включить и отключить поставщиков при первом запуске приложения на основе android.os.Build.VERSION, используя PackageManager и setComponentEnabledSetting(), чтобы дать вам правильный набор. Так как на Android 3.1+ пользователю нужно будет запустить одно из ваших действий, чтобы иметь возможность добавлять виджет приложения, во всяком случае, у вас есть хотя бы точка входа для применения этой логики.

Ответ 2

OP уже получил свое решение, но для остальных из нас мы можем использовать значения bool в xml и устанавливать их по-разному в разных каталогах ресурсов.

Итак, ваш AndroidManifest выглядит примерно так:

<receiver
  android:label="@string/app_widget_small"
  android:enabled="@bool/is_pre_api_11">

  <!-- App Widget Stuff Here -->

</receiver>
<receiver
  android:label="@string/app_widget_large"
  android:enabled="@bool/is_pre_api_11">

  <!-- App Widget Stuff Here -->

</receiver>
<receiver
  android:label="@string/app_widget_resizeable"
  android:enabled="@bool/is_post_api_11">

  <!-- App Widget Stuff Here -->

</receiver>

И в /res/values/attrs.xml:

<resources>
    <bool name="is_pre_api_11">true</bool>
    <bool name="is_post_api_11">false</bool>
</resources>

Затем в /res/values-v11/attrs.xml:

<resources>
    <bool name="is_pre_api_11">false</bool>
    <bool name="is_post_api_11">true</bool>
</resources>

Теперь ваш API 10 и ниже будет иметь два виджета приложений (малые и большие), а API 11 и выше будет иметь один виджет с изменяемым размером.