ActionBarSherlock和ActionBar兼容性之间的区别


156

ActionBarSherlockAction Bar兼容性有什么区别

几天前,Google刚刚发布了ActionBar兼容性,这让我非常困惑。动作栏兼容性是否与ActionBarSherlock相同,并且编码是否相同?

示例:动作栏兼容性是否支持应用程序图标“向上”导航或ActionBar.Tab?


12
仅供参考,我为Square的英语博客写了一篇有关此的博客文章:corner.squareup.com/2012/05/actionbarsherlock-as-a-base.html
Jake Wharton

3
youtube.com/… 这就是Google对ActionBarSherlock与ActionBarCompact的看法
Rolf

对于想从ABS迁移到ABCompat的用户来说,这是一个重要且有用的线程。谢谢。
Ashokchakravarthi Nagarajan 2014年

Answers:


61

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

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

- 编辑 -

看来情况已经变了,ActionBarSherlock和Action Bar兼容性之间实际上没有任何区别。请阅读下面的评论以获取详细信息。

- 编辑 -

现在已经使用了两者,可以说我实际上更喜欢ActionBarSherlock而不是Action Bar Compatibility。ActionBarSherlock确实非常易于使用。

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


1
@Anidamo感谢您的注意。我可能会发疯,但我可以发誓,如果您的3.0之前的版本,android兼容性包中的版本没有给您一个。我已经修改了答案。
Kurtis Nusbaum

35
同样,答案是完全错误的-兼容性示例的目的是支持3.0之前的设备。
AlikElzin-kilaka '02

8
Google发布了一个新的向后兼容的Action Bar实现,称为ActionBarCompat,它是Support Library r18的一部分。通过ActionBarCompat API,您可以在应用中构建基本的操作栏设计模式,并具有与Android 2.1的广泛兼容性。
LOG_TAG 2013年

3
以下链接告诉您whyhow使用新的ActionBarCompat API,android-developers.blogspot.in
2013/08

2
补充一下,对于那些认为自己可能希望将Chromecast集成到他们的应用中的人,我强烈建议您使用appcompat库。Chromecast集成所需的MediaRouter API取决于appcompat;无法使用ActionBarSherlock。
clu 2013年

113

ActionBarSherlock与ActionBarCompat:

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

 ActionBarSherlock与ActionBarCompat **强文本**

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

脚步:

  1. 导入AppCompat项目。

  2. 替换SherlockFragmentActivityActionBarActivity

  3. 替换SherlockFragmentFragment

  4. 变化MenuMenuItem以及getSupportMenuInflater()引用。修改获取操作视图的方式。

    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相同的单元测试方式。

输出:

在此处输入图片说明

学分:Gabriele Mariotti


1
现在可以通过以下方式将ABS更新也可以添加到Gradle项目中,compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'而不必是库项目。
ankushg 2014年

感谢您的详细解释
Biswajit达斯

41

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

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

我构建了两个简单的应用程序来显示ActionBarSherlock和ActionBar兼容性之间的视觉差异。查看比较图像:

使用兼容性库的应用

使用Sherlock库的应用

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

在菜单上使用兼容性的应用

在菜单上按下使用夏洛克的应用


如您所见,这些图像仅能执行所说的内容。操作栏兼容性仅在运行的设备是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;
     }
}

Sherlock的活动:

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应用程序上,需要其他配置:

<style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar">

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


5
实际上,这并不完全正确。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提供了更多功能,不是吗?
布鲁诺·马特乌斯

2
使用最新的android支持库(api 18),我看到它们已经对actionbar内置了支持(称为ActionBarCompat类)。
rudy s

GingerBEARD?爱它。
卡洛斯·P

39

与简单的Actionbar兼容性项目相比,Actionbar Sherlock更加先进和雄心勃勃。

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

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

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

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


我想念什么吗?似乎ABS不支持多选功能
jiduvah 2012年

1
抱歉耽搁了。ABS本身不支持多选。但是,您可以使用ABS“ ActionMode”来实现Multiselect,因为ABS拥有自己的ActionMode类实现。进入“多选模式”时,可以将ListView的选择模式设置为CHOICE_MODE_MULTIPLE,并通过调用getSherlockActivity()。startActionMode(callback)调用ActionMode
Glenn Bech

26

@Jake的实现远比Actionbar兼容的要精确得多,更准确地说,Actionbar Compat只是一个基本示例,说明如何使用Honeycomb(API 13)之前的版本的伪Actionbar支持所有应用。尽管他们的目标是相同的交叉兼容操作栏,但他们有不同的方法。

ActionbarCompat方法

此实现不使用Compatibility Android支持库,而是创建一个名为ActionBarActivity的基类,创建一个Helper的单个实例,此helper充当工厂本身,为APIS的三个部分返回不同的实现,并返回

最有趣的部分是ActionbarBaseHelper,因为它具有最重要的代码,我建议您了解此类,您将获得完整的示例。

动作酒吧夏洛克

好吧,这首先是棘手的,因为我不是作者,也许杰克可以进一步解释这一点,但是我会尝试一下。

正如Compat Sherlock的实现方式不同,一个是“ Compat”的,另一个是Native的。它迫使您从SherlockActivity或SherlockFragmentActivity进行扩展,因为这两个基类具有分派ActionBar的方法。

这是一个庞大而复杂的项目,无法在单个帖子中进行解释。建议您深入探究Sherlock Github仓库,看看Jeff Atwood所说的

在此处输入图片说明


10
  • 我坚信您应该将ActionBarCompat所有支持旧设备的新项目使用。

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

为什么与ActionBarSherlock相比,您应该更喜欢ActionBarCompat?

有许多原因使您应该首选ActionbarCompat而不是ActionbarSherlock。

  1. 首先,该项目由Google负责,是支持库的一部分,因此可能会在Google发行带有Android的库存的同时支持与Action Bar相关的新内容。

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

  3. 最后也是重要的一点是,ActionBarSherlock的创建者Jake Wharton在Google+上宣布,ActionBarSherlock的进一步开发已停止。ActionBarSherlock 4.4是最新版本,可能会修复一些错误-但不会有任何新功能:因此,如果actionbar中包含新功能,则您可能无法与actionbarsherlock保持同步。


7

也许我们应该更新答案,因为Google自API18以来发布了正式的Actionbar支持?

下面的块来自有关这两个库的官方博客

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

  • 可以随着Action Bar API的发展而保持更新。
  • 集成的祖先导航支持。
  • 使用框架的Menu和MenuItem类。
  • 继续使用支持库的Fragment类。
  • 对与DrawerLayout一起使用的ActionBarDrawerToggle的集成支持。
  • PopupMenu的反向端口。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.