Android 根据API级别隐藏应用程序小部件

Android 根据API级别隐藏应用程序小部件,android,android-widget,Android,Android Widget,我已经为Honecomb之前版本的Android创建了三个不同大小的应用程序小部件,为Honeycom和更高版本创建了一个可调整大小的可滚动listview小部件 由于widget提供相同的功能,并且针对蜂窝和更高版本的widget是可调整大小的,因此我想删除API级别12或更高版本的widget的其他版本。这有可能吗 据我所知,如果一个小部件可以找到AppWidgetProviderInfo资源文件,那么似乎没有任何方法可以禁止它通过AppWidgetService注册。因此,我似乎只能在更高

我已经为Honecomb之前版本的Android创建了三个不同大小的应用程序小部件,为Honeycom和更高版本创建了一个可调整大小的可滚动listview小部件

由于widget提供相同的功能,并且针对蜂窝和更高版本的widget是可调整大小的,因此我想删除API级别12或更高版本的widget的其他版本。这有可能吗


据我所知,如果一个小部件可以找到AppWidgetProviderInfo资源文件,那么似乎没有任何方法可以禁止它通过AppWidgetService注册。因此,我似乎只能在更高版本中包含小部件,但不能排除在xml文件夹中定义的针对早期API版本的版本。

如果是具有HC或HC之前实现的单个应用程序小部件,您可以将它们组合成一个
AppWidgetProvider
,并使用
res/xml-v11/
res/xml/
来拥有不同的元数据


不过,我能想到的处理您的场景的唯一方法是在清单中将一些
AppWidgetProviders
标记为禁用(
android:enabled=“false”
),然后使用
PackageManager
setComponentEnabledSetting()
,基于
android.os.Build.VERSION
在应用程序第一次运行时启用和禁用提供商,以提供正确的设置。由于在Android 3.1+上,用户需要启动您的一项活动才能添加应用程序小部件,无论如何,您至少有了应用此逻辑的入口点。

OP已经得到了他的解决方案,但对于我们其他人来说,我们可以利用xml中的
bool
值,并在不同的资源目录中进行不同的设置

因此,您的
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-v11/attrs.xml
中:

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

假的
真的

现在,您的API 10及以下版本将有两个应用程序小部件(大小),API 11及更高版本将有一个可调整大小的应用程序小部件

多谢各位。这个解决方案非常有效。如果您可以使用
appwidget provider
中的
android:enabled
属性,那就更好了,但这必须做到:)@Commonware可以给你一些简单的想法。你为什么不制作一个
xml
文件,里面有一个布尔值呢。在
res/values-v11/
(或者应该排除它的任何一个)中,将布尔值设置为false,并在
AndroidManifest
中,引用
android:enabled=“@bool/enable\u listview\u appwidget”
?@xbakesx:当我写下这个答案时,我可能认为您的方法只能朝一个方向工作。然而,有了两个
bool
资源,它就可以在这种情况下工作。拥有
@bool/honeycomb
@bool/not_honeycomb
,具有
res/values/
res/values-v11/
中的适当值,并使用
android:enabled
属性中的值。@Harshid我为您添加了一个示例,看起来您只能使用一个bool@Alexey,是的,在这种情况下,你可以只使用一个布尔值,那是4.5年前的事了,但我很确定我有其他条件,利用同样的策略。好的调用,在这个简单的例子中,一个布尔值就足够了。