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

Posted

技术标签:

【中文标题】根据 API 级别隐藏应用小部件【英文标题】:Hide app widget depending on API level 【发布时间】:2012-03-29 15:24:58 【问题描述】:

我为 Honecomb 之前的 android 版本创建了三个不同大小的应用小部件,并为 Honeycomb 及更高版本创建了一个可调整大小的可滚动列表视图小部件。

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

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

【问题讨论】:

【参考方案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/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 及更高版本将拥有一个可调整大小的应用小部件。

【讨论】:

好像你只能使用一个 bool @Alexey,是的,在这种情况下你可以只使用一个布尔值,那是 4.5 年前的现在,但我很确定我有其他条件可以利用相同的策略。不过很好,在这种简单的情况下,只需一个布尔值就足够了。【参考方案2】:

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

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

【讨论】:

谢谢。这个解决方案效果很好。如果您可以在appwidget-provider 中使用android:enabled 属性会更好,但这必须这样做.. :) @CommonsWare 你能给出一些简单的想法吗? 你为什么不直接创建一个带有布尔值的xml 文件。在res/values-v11/(或应排除的任何一个)中将布尔值设置为false,并在AndroidManifest 中引用android:enabled="@bool/enable_listview_appwidget" 的布尔值? @xbakesx:当我写这个答案时,我可能在想你的方法只会在一个方向上起作用。但是,使用 两个 bool 资源,它可以适用于这种情况。拥有@bool/honeycomb@bool/not_honeycomb,具有来自res/values/res/values-v11/ 的适当值,并在android:enabled 属性中使用这些值。 @Harshid 我为您添加了一个带有示例的答案。

以上是关于根据 API 级别隐藏应用小部件的主要内容,如果未能解决你的问题,请参考以下文章

Android API指南之应用程序窗口小部件

如何隐藏 Qt 小部件应用程序菜单栏?

很想在小部件上隐藏此按钮?

如何在单页应用程序 (SPA) 的特定页面中隐藏对讲聊天小部件?

如何根据应用程序小部件中文本视图中的小部件大小调整文本大小?

Android API指南之应用程序窗口小部件主机