蜂窝结构和向后兼容性的策略

30

所以我们已经见过了预览SDK和新的酷炫功能,例如ActionBar和Fragments。为了使用这些功能,将不可避免地需要进行大量方法调用,那么有什么策略可以维护一个应用程序版本,让我可以使用所有新功能,同时也能在运行Android 2.3或更早版本的设备上工作? 我的应用目前针对1.5-2.3版本。

5个回答

27

现在可以将相同的Fragment API作为静态库供旧版本的Android使用;它向后兼容到Android 1.6。

有一些技巧可以用来查看您的应用程序是否可用各种新的API。通常情况下,您可能需要创建两套备选的Activities,一套使用新的高级API(ActionBar、Animators等)-另一套则不使用。

以下代码展示了如何使用反射和异常捕获来确定Fragment API的可用性,并使用版本检查来确认其他Honeycomb API是否可用。

  private static boolean shinyNewAPIsSupported = android.os.Build.VERSION.SDK_INT > 10;

  private static boolean fragmentsSupported = false;

  private static void checkFragmentsSupported() throws NoClassDefFoundError {
    fragmentsSupported = android.app.Fragment.class != null;
  }

  static {
    try {
      checkFragmentsSupported();
    } catch (NoClassDefFoundError e) {
      fragmentsSupported = false;
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent startActivityIntent = null;
    if (!shinyNewAPIsSupported)
      startActivityIntent = new Intent(this, MainNonActionBarActivity.class);
    else
      startActivityIntent = new Intent(this, MainActionActivity.class);

    startActivity(startActivityIntent);
    finish();
  }

一般来说,您可以使用相同的布局定义。在可用Fragment的情况下,您将在不同的Fragment中填充每个布局;在没有它们的情况下,您可能需要使用<include>标签将它们嵌入到更复杂的Activity布局中。

如何编写支持Honeycomb向后兼容的代码的更详细的工作流程可以在这里找到:http://blog.radioactiveyak.com/2011/02/strategies-for-honeycomb-and-backwards.html


5
如果你只需要额外的API是操作栏,可以看一下我写的一个库,它是兼容性库的扩展,只添加了那个API。它为操作栏提供了单一的API,并允许使用单一的主题。你可以在http://actionbarsherlock.com找到更多信息。 - Jake Wharton

3

方便的是,Google的Dianne Hackborne发布了一篇博客文章涵盖了这个确切的主题。Google表示他们将提供静态库,以便旧版本的Android也能使用片段。


2
你可能会发现Reto Meier的关于向后兼容性的文章很有用,特别是标题为“处理缺失类”的部分。
我自己还没有看过Honeycomb SDK,但像你一样,我希望能够轻松地使用新功能,而不会影响旧设备的兼容性。

1
还可以查看这篇文章,其中提供了更多使用多个平台版本的示例:http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html - adamp
我都看过了,但是看起来 Honeycomb 会更加复杂,尤其是像 Fragments 和 ActionBar 这样的东西。你认为使用这些技术就足够了吗? - Al.

1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接