【问题标题】:Difference between ActionBarSherlock and ActionBar CompatibilityActionBarSherlock 和 ActionBar 兼容性的区别
【发布时间】:2011-12-12 06:30:45
【问题描述】:

ActionBarSherlockAction Bar Compatibility有什么区别

几天前,谷歌刚刚发布了让我很困惑的 ActionBar 兼容性。 Action Bar Compatibility 是否与 ActionBarSherlock 的工作方式相同并且编码是否相同?

示例:Action Bar Compatibility 是否支持 app icon to navigate "up" 或 ActionBar.Tab?

【问题讨论】:

标签: java android actionbarsherlock android-actionbar android-actionbar-compat


【解决方案1】:

ActionBarSherlock 与 ActionBarCompat:

我只想在 ActionBarSherlock 与 ActionBarCompat Lib 之间放置一些代码差异

我们可以将一些应用从 ActionBarSherlock 迁移到 ActionBarCompat:

步骤:

  1. 导入 AppCompat 项目。

  2. SherlockFragmentActivity 替换为 ActionBarActivity

  3. SherlockFragment 替换为 Fragment

  4. 更改 MenuMenuItemgetSupportMenuInflater() 引用。 修改获取 Action View 的方式。

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. 修改您的主题样式

有关更多信息,请参阅+NickButcher (Google) 提供的幻灯片

感谢来源: http://gmariotti.blogspot.in/2013/07/actionbarsherlock-vs-actionbarcompat.html http://antonioleiva.com/actionbarcompat-migrating-actionbarsherlock/

别忘了阅读developer.android 了解更多关于 ABC 的信息!

注意:不幸的是,支持库无法像 ABS 一样为单元测试设置它。

输出:

致谢:加布里埃尔·马里奥蒂

【讨论】:

  • 只是一个更新,ABS 现在也可以通过compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar' 添加到 Gradle 项目中,并且不必是库项目。
  • 感谢详细解释
【解决方案2】:

ActionBarSherlock 为您的应用程序提供一个操作栏,无论*您的应用程序在哪个版本的 android API 上运行。只有当您运行的设备是 API 级别 3.0 或更高版本时,操作栏兼容性才会为您提供操作栏。

*请注意,如果您运行的设备不是 3.0 或更高版本,ActionBarSherlock 将使用它自己的自定义操作栏实现,而不是原生的。

--编辑--

看起来事情已经发生了变化,实际上 ActionBarSherlock 和 Action Bar Compatibility 之间没有区别了。详情请阅读下面的cmets。

--编辑--

现在都使用了之后,我可以说我实际上更喜欢 ActionBarSherlock 而不是 Action Bar Compatibility。 ActionBarSherlock 非常简单易用。

--编辑-- 正如 LOG_TAG 所提到的,Android 支持库中现在支持操作栏。我还没有机会使用它,但我想这是最好用的。

【讨论】:

  • @Anidamo 感谢您的提醒。我可能会发疯,但我可以发誓,如果你的 3.0 之前的版本,Android 兼容包中的版本没有给你一个。我修改了答案。
  • 另外,答案是完全错误的——兼容性示例的目的是支持 3.0 之前的设备。
  • Google 发布了一个新的向后兼容的 Action Bar 实现,称为 ActionBarCompat,它是 Support Library r18 的一部分。 ActionBarCompat API 让您可以将基本的 Action Bar 设计模式构建到您的应用中,并广泛兼容 Android 2.1。
  • 以下链接告诉您 whyhow 使用新的 ActionBarCompat API,android-developers.blogspot.in/2013/08/…
  • 只是补充一点,对于那些认为他们可能希望在他们的应用程序中集成 Chromecast 的人,我强烈建议使用 appcompat 库。 Chromecast 集成所需的 MediaRouter API 取决于 appcompat;无法使用 ActionBarSherlock。
【解决方案3】:

只是用一个实际的例子来完成@Kurtis Nusbaum 的内容。

更新:正如@rudy-s 所说,使用最新的 android 支持库 (api 18),我看到他们已经内置了对 actionbar 的支持(称为 ActionBarCompat 类)。

我构建了两个简单的应用程序来展示 ActionBarSherlock 和 ActionBar Compatibility 之间的视觉差异。查看对比图:

现在按下菜单按钮时的外观:


如您所见,图像只是强化了所说的内容。 操作栏兼容性仅在您运行的设备为 API 级别 3.0 或更高版本时为您提供操作栏。虽然夏洛克更笼统。

下面可以看到应用源码。

菜单xml文件同理:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/action_1"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="@string/action1"/>

<item
    android:id="@+id/action_2"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action2"/>

<item
    android:id="@+id/action_3"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action3"/>

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_settings"/>

</menu>

兼容性的活动:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
     }
}

夏洛克的活动:

public class MainActivity extends SherlockActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

}

sherlock 应用需要额外的配置:

&lt;style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar"&gt;

更新: 正如@rudy-s 所说,使用最新的 android 支持库(api 18),我看到他们已经内置了对 actionbar 的支持(称为 ActionBarCompat 类)。

【讨论】:

  • 其实这并不完全正确。 Compat 库可以并且确实为您提供了 Gingerbread 上的 ActionBar 实现。例如,此应用程序为您提供 GB 上的 AB,并且不使用 Sherlock 而是使用 Compat。 play.google.com/store/apps/details?id=uk.co.mxdata.rootle
  • 没有必要,如果您将 actionbarcompat 样本拉出(例如从 android-17 sdk 中提取)并在 ADT 中构建它,它将在带有 ActionBar 的 GB 设备上运行。我只是自己测试了它,以在 2.3.5 的 Desire HD 上进行确认。
  • 好的,我知道了。但是,ActionBarSherlock 提供了更多的功能,不是吗?
  • 有了最新的android支持库(api 18),我看到他们已经内置了对actionbar的支持(称为ActionBarCompat类)。
  • 姜胡子?喜欢它。
【解决方案4】:

Actionbar Sherlock 比简单的 Actionbar 兼容性项目更先进、更雄心勃勃。

如果您只想在应用顶部添加一个操作栏,则可以将操作栏兼容性视为一个“示例”或一个很好的起点。

ActionBarSherlock 建立在兼容性库之上,并为您(如操作栏兼容性示例)在 3.0 之前的设备上提供了一个操作栏。此外,它还具有 ActionBar Compat 代码中不存在的额外功能。这包括但不限于

  • setNavigationMode(用于操作栏中的选项卡和微调器)
  • 对话片段
  • 上下文操作栏 (CAB) 接管操作栏的菜单,例如用于多选 (http://developer.android.com/design/patterns/new-4-0.html) 这是一个ICS 功能 (!) 为此,必须将 ActionMode 类的实现(在 API 级别 11 中引入)引入到 ActionbarSherlock 库中
  • Fragment 和 FragmentActivity 实现 - 因为 Fragment 可以实现 onCreateOptions 菜单,所以我们需要确保使用 SupportMenuInflater。
  • 两个主题与 Holo.Dark 和 Holo.Light(Theme.Sherlock、Theme.Sherlock.Light)没有太大区别
  • ICS 功能“拆分操作栏”

我看到使用 ActionbarSherlock 的唯一缺点是您将自己锁定在该库中。如果由于某种原因它会在不久的将来消失,您将不得不自己维护它(例如,如果没有 Jellybean 实现出现)。这是一个麻烦(不是一个大问题),因为您的所有片段都扩展了 SherlockFragemnt 和您的所有活动。 SherlockActivity。

【讨论】:

  • 我错过了什么吗?似乎 ABS 不支持多选
  • 抱歉耽搁了。 ABS 本身不支持多选。但是,您可以使用 ABS“ActionMode”来实现多选,因为 ABS 有自己的 ActionMode 类实现。进入“多选模式”时,将ListView的选择模式设置为CHOICE_MODE_MULTIPLE,并通过调用getSherlockActivity().startActionMode(callback)调用ActionMode
【解决方案5】:

好吧,@Jake 实现比 Actionbar 兼容更进一步,更准确地说,Actionbar Compat 只是一个基本示例,说明如何使用伪操作栏支持所有应用程序,以用于 Honeycomb (API 13) 之前的版本。虽然他们的目标是相同的交叉兼容操作栏,但他们有不同的方法。

ActionbarCompat 方法

此实现不使用兼容性 Android 支持库,而是创建一个名为 ActionBarActivity 的基类创建 Helper 的单个实例,此帮助器本身充当工厂,为 APIS 的三个部分返回不同的实现,它返回

最有趣的部分在ActionbarBaseHelper,因为它有最重要的代码,我建议你理解这个类,你会得到整个例子。

动作栏夏洛克

这很棘手,因为,我不是作者,也许 Jake 可以进一步解释,但我会试一试。

就像compat Sherlock 做出不同的实现,但一个是“Compat”,另一个是Native。它迫使您从 SherlockActivity 或从 SherlockFragmentActivity 扩展,因为这两个基类具有调度 ActionBar 的方法。

这是一个庞大而复杂的项目,无法在一篇文章中解释。建议你在Sherlock Github repo 周围挖掘一下,就像Jeff Atwood 所说的那样

【讨论】:

    【解决方案6】:
    • 我坚信您应该使用ActionBarCompat 来处理所有新的 想要支持旧设备的项目。

    • 迁移现有项目也可能有意义。所以请继续阅读 了解为什么应该立即迁移或使用 ActionBarCompat 并 如何迁移现有项目。

    为什么您应该更喜欢 ActionBarCompat 而不是 ActionBarSherlock?

    您应该更喜欢 ActionbarCompat 而不是 ActionbarSherlock 的原因有很多。

    1. 首先这个项目是由谷歌提供的,是支持的一部分 库,因此可能会支持新的操作栏相关的东西 与此同时,谷歌也发布了他们的安卓系统。

    2. 另一个很好的理由是它支持开箱即用的Navigation Drawer pattern,而ActionBarSherlock 不支持。因此 如果您想将此抽屉添加到现有项目/应用程序中,您应该 迁移。

    3. 最后也是重要的是,ActionBarSherlock 的创建者, Jake Wharton 在 Google+ 上宣布进一步开发 ActionBarSherlock 已停止。 ActionBarSherlock 4.4 是 最后一个版本,可能会修复错误——但不会有任何新的 功能:因此,如果操作栏中包含新功能,您可以 actionbarsherlock 跟不上它。

    【讨论】:

      【解决方案7】:

      也许我们应该更新答案,因为谷歌自 API18 以来发布了官方的 Actionbar 支持?

      下面的块来自offical blog 关于这两个库:

      如果您使用第三方解决方案(例如 ActionBarSherlock),有几个理由考虑升级:

      • 可以随着操作栏 API 的发展而不断更新。
      • 集成的祖先导航支持。
      • 使用框架 Menu 和 MenuItem 类。
      • 继续使用支持库的 Fragment 类。
      • 集成了对 ActionBarDrawerToggle 的支持,可与 DrawerLayout 一起使用。
      • PopupMenu 的向后移植。

      ActionBarSherlock 是一个可靠且经过良好测试的库,长期以来一直为开发人员提供良好的服务。如果您已经在使用它并且目前不需要上述任何一项,则无需迁移。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 2011-05-26
        • 2012-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多