可调整大小的向后兼容性

时间:2014-02-12 08:48:02

标签: android android-widget

我想为用户提供以下不同Android版本的小部件设置:

  • 2.3到3.0:2个小部件,一个是1x1,另一个是2x2
  • 3.1+:仅限1个可调整大小的小部件

即。 我想在Gingerbread 上为用户提供更多小部件,因为我们无法调整它们的大小。

原因:

  • 作为3.1 + 的用户,我不希望看到许多重复的小部件大小。我想看一个小部件,我可以调整大小
  • 作为2.3 的用户,我无法调整大小。我希望看到两个不同大小的小部件。

我所知道的:

  • 我可以在我的XML目标版本中使用android:resizeMode="horizontal|vertical",这将在2.3上被忽略。这不会破坏小部件
  • 或者我可以使用XML文件夹定位特定的API级别,例如xml\& xml-v12

但是第二个选项只允许xml\中的资源被替换,如果它们在xml-v12\中重新声明。

有没有办法在以后的API版本中删除资源,而不是替换它们?


解决方法:

  1. 在清单中声明2个小部件,但禁用其中一个小部件。
  2. 当应用程序在早期设备上首次运行时,请启用第二个小部件。
  3. 只要用户在尝试安装小部件之前运行应用程序,效果就会很完美。
  4. (注意:根据@CommonsWare,最好在默认情况下启用两个小部件,并在3.1 +上首次运行应用程序时禁用小部件)

1 个答案:

答案 0 :(得分:0)

这个问题类似于:Hide app widget depending on API level(我在JGFI时无法找到......)

下面提供的答案摘要,我认为最好。


@CommonsWare的

The accepted answer基本上是使用我上面描述的解决方法。他建议的一个增强功能是在3.1之前启用两者,并且仅在应用程序运行时禁用并检测到3.1 +。

这是因为3.1要求在用户添加小部件之前运行Activity。 3.0没有这样的要求。这样做意味着3.1之前的用户总是看到两个小部件,而3.1+用户看不到这两个小部件。


A better answer ,imho,由@xbakesx提供。

他的建议是定义用于启用或禁用XML中小部件的布尔资源:

/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>

使用这些定义的布尔资源在AndroidManifest.xml中启用相应的窗口小部件:

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

  <!-- App Widget Stuff Here -->

</receiver>