ActionBarSherlock和ActionBar兼容性之间的区别

时间:2011-10-21 03:03:37

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

ActionBarSherlockAction Bar Compatibility

之间有什么区别?

几天前谷歌刚刚发布了令我如此困惑的ActionBar兼容性。操作栏兼容性是否与ActionBarSherlock相同,编码是否相同?

示例:操作栏兼容性是否支持app icon to navigate "up"或ActionBar.Tab?

7 个答案:

答案 0 :(得分:113)

ActionBarSherlock与ActionBarCompat:

我只想在ActionBarSherlock与ActionBarCompat Lib

之间设置一些代码差异

 ActionBarSherlock vs ActionBarCompat **strong text**

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

步骤进行:

  1. 导入 AppCompat 项目。

  2. SherlockFragmentActivity 替换为 ActionBarActivity

  3. SherlockFragment 替换为 Fragment

  4. 更改Menu MenuItem getSupportMenuInflater() 引用。 修改获取操作视图的方式。

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. 修改主题样式
  6. 有关详细信息,请参阅此+NickButcher(Google)

    的幻灯片
      

    enter image description here

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

    不要忘记阅读此developer.android了解有关ABC的更多信息!

    注意:不幸的是,使用支持库无法以与ABS相同的方式设置单元测试。

    输出:

      

    enter image description here

    致谢:Gabriele Mariotti

答案 1 :(得分:61)

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

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

- 编辑 -

似乎事情已经发生了变化,ActionBarSherlock和Action Bar兼容性之间实际上没有任何区别。请阅读以下评论以获取详细信息。

- 编辑 -

现在使用了两者之后,我可以说我实际上更喜欢ActionBarSherlock与Action Bar兼容性。 ActionBarSherlock非常简单易用。

- EDIT-- 正如LOG_TAG所述,现在支持Android支持库中的操作栏。我还没有机会使用它,但我认为这是最好用的。

答案 2 :(得分:41)

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

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

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

App using compatibility library

App using sherlock library

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

App using compatibility on menu pressed

App using sherlock on menu pressed


正如您所看到的,图像只是强制执行所说的内容。 仅当您运行的设备是API级别3.0或更高级别时,操作栏兼容性才会为您提供操作栏。虽然Sherlock更通用。

您可以在下面看到应用程序源。

菜单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类)。

答案 3 :(得分:39)

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

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

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

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

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

答案 4 :(得分:26)

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

ActionbarCompat Aproach

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

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

Action Bar Sherlock

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

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

这是一个庞大而复杂的项目,无法在一篇文章中解释。建议你挖掘Sherlock Github repo,看看Jeff Atwood

enter image description here

答案 5 :(得分:10)

  • 我坚信你应该使用ActionBarCompat来表示所有新内容 想要支持旧设备的项目。

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

为什么你应该比ActionBarSherlock更喜欢ActionBarCompat?

有很多原因可以让你更喜欢ActionbarCompat而不是ActionbarSherlock。

  1. 首先,这个项目由Google提供,是支持的一部分 图书馆因此可能会支持新的Action Bar相关内容 谷歌同时发布Android版本。

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

  3. 最后和重要的是,ActionBarSherlock的创建者, 杰克沃顿在Google+上宣布进一步发展 ActionBarSherlock已停止。 ActionBarSherlock 4.4是 最新版本可能会修复错误 - 但不会有任何新的错误 功能:如果动作栏中包含新功能,您可以 使用actionbarsherlock无法跟上它。

答案 6 :(得分:7)

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

下面的

块来自offical blog这两个库:

  

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

     
      
  • 随着Action Bar API的发展,可以保持更新。
  •   
  • 集成祖先导航支持。
  •   
  • 使用框架Menu和MenuItem类。
  •   
  • 继续使用支持库的Fragment类。
  •   
  • ActionBarDrawerToggle的集成支持,用于DrawerLayout。
  •   
  • PopupMenu的Backport。
  •   
     

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