Sự khác biệt giữa Tương thích ActionBarSherlock và ActionBar


156

Sự khác biệt giữa tính tương thích của ActionBarSherlockAction Bar

Cách đây vài ngày, Google mới phát hành tính tương thích ActionBar khiến tôi rất bối rối. Có phải tính tương thích của Action Bar hoạt động giống như ActionBarSherlock và mã hóa có giống nhau không?

Ví dụ: Biểu tượng ứng dụng để điều hướng "lên" hoặc ActionBar.Tab có được hỗ trợ trong tính tương thích của Action Bar không?


12
FYI Tôi đã viết một bài đăng blog về điều này cho blog eng của Square: angle.sapesup.com/2012/05/actionbarsherlock-as-a-base.html
Jake Wharton

3
youtube.com ( Đây là những gì Google nghĩ về ActionBarSherlock vs ActionBarCompact
Rolf

Đây là một chủ đề quan trọng và hữu ích, cho những ai muốn chuyển từ ABS sang ABCompat. Cảm ơn.
Ashokchakravarthi Nagarajan

Câu trả lời:


61

ActionBarSherlock cung cấp cho ứng dụng của bạn một thanh hành động bất kể * phiên bản API Android nào mà ứng dụng của bạn đang được chạy. Tính tương thích của Action Bar chỉ cung cấp cho bạn thanh hành động nếu thiết bị bạn đang chạy là API cấp 3.0 trở lên.

* Lưu ý rằng nếu thiết bị bạn đang chạy không phải là 3.0 trở lên, ActionBarSherlock sẽ sử dụng triển khai tùy chỉnh của thanh hành động, chứ không phải thiết bị gốc.

--BIÊN TẬP--

Có vẻ như mọi thứ đã thay đổi và thực sự không có sự khác biệt giữa ActionBarSherlock và Action Bar Tương thích nữa. Xin vui lòng đọc các ý kiến ​​dưới đây để biết chi tiết.

--BIÊN TẬP--

Sau khi sử dụng cả hai, tôi có thể nói rằng tôi thực sự thích ActionBarSherlock hơn cho tính tương thích của Action Bar. ActionBarSherlock thực sự dễ sử dụng và tốt đẹp.

--EDIT-- Như LOGiah đã đề cập, hiện đã có hỗ trợ cho thanh hành động trong Thư viện hỗ trợ Android. Tôi chưa có cơ hội sử dụng nó, nhưng tôi sẽ tưởng tượng đó là cách tốt nhất để sử dụng.


1
@Anidamo Cảm ơn vì đã ngẩng cao đầu. Tôi có thể sẽ phát điên, nhưng tôi có thể thề rằng tại một thời điểm, phiên bản trong gói tương thích Android không cung cấp cho bạn một phiên bản trước phiên bản 3.0 của bạn. Tôi đã sửa đổi câu trả lời của mình.
Kurtis Nusbaum

35
Ngoài ra, câu trả lời là hoàn toàn sai - mục đích của ví dụ tương thích là hỗ trợ các thiết bị tiền 3.0.
AlikElzin-kilaka

8
Google đã phát hành một triển khai Action Bar tương thích ngược mới có tên ActionBarCompat, một phần của Thư viện hỗ trợ r18. API ActionBarCompat cho phép bạn xây dựng mẫu thiết kế Action Bar thiết yếu vào ứng dụng của mình, với khả năng tương thích rộng trở lại Android 2.1.
LOGiah

3
Sau liên kết cho bạn biết whyhowsử dụng API ActionBarCompat mới, android-developers.blogspot.in/2013/08/...
Venom

2
Chỉ cần thêm, đối với những người nghĩ rằng họ có thể muốn tích hợp Chromecast trong ứng dụng của họ, tôi khuyên bạn nên sử dụng thư viện appcompat. API MediaRouter cần thiết cho tích hợp Chromecast tùy thuộc vào appcompat; ActionBarSherlock không thể được sử dụng.
clu

113

ActionBarSherlock vs ActionBarCompat:

Tôi chỉ muốn đặt một vài sự khác biệt về mã giữa ActionBarSherlock so với ActionBarCompat Lib

 ActionBarSherlock vs ActionBarCompat ** văn bản mạnh mẽ **

Chúng tôi có thể di chuyển một số ứng dụng từ ActionBarSherlock sang ActionBarCompat:

các bước:

  1. Nhập dự án AppCompat .

  2. Thay thế SherlockFragmentActivitybằng ActionBarActivity.

  3. Thay thế SherlockFragmentbằng Fragment.

  4. Thay đổi Menu, MenuItemgetSupportMenuInflater()tài liệu tham khảo. Sửa đổi cách bạn có được Lượt xem hành động.

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. Sửa đổi Chủ đềPhong cách của bạn .

Để biết thêm thông tin, vui lòng tham khảo các slide này bằng + NickButcher (Google)

nhập mô tả hình ảnh ở đây

Cảm ơn các nguồn: http://gmariotti.blogspot.in/2013/07/actionbarsherlock-vs-actionbarcompat.html http://antonioleiva.com/actionbarcompat-migrating-actionbarsherlock/

Đừng quên đọc nhà phát triển này.android để biết thêm về ABC!

Lưu ý: Không thể thiết lập nó để kiểm tra đơn vị theo cách tương tự như không may với thư viện hỗ trợ.

Đầu ra:

nhập mô tả hình ảnh ở đây

Tín dụng: Gabriele Mariotti


1
Chỉ cần một bản cập nhật mà giờ đây ABS cũng có thể được thêm vào các dự án Gradle thông qua compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'và không phải là một dự án thư viện.
ankushg

Cảm ơn đã giải thích chi tiết
Biswajit Das

41

Chỉ cần hoàn thành những gì @Kurtis Nusbaum với một ví dụ thực tế.

CẬP NHẬT: như @ rudy-s đã nói, với thư viện hỗ trợ Android mới nhất (api 18), tôi thấy họ đã có hỗ trợ tích hợp cho thanh hành động (được gọi là lớp ActionBarCompat).

Tôi đã xây dựng hai ứng dụng đơn giản để hiển thị sự khác biệt trực quan giữa Tương thích ActionBarSherlock và ActionBar. Xem hình ảnh so sánh:

Ứng dụng sử dụng thư viện tương thích

Ứng dụng sử dụng thư viện sherlock

Bây giờ xuất hiện khi nhấn nút menu:

Ứng dụng sử dụng tính tương thích trên menu nhấn

Ứng dụng sử dụng sherlock trên menu nhấn


Như bạn có thể thấy, những hình ảnh chỉ thực thi những gì đã nói. Tính tương thích của Action Bar chỉ cung cấp cho bạn thanh hành động nếu thiết bị bạn đang chạy là API cấp 3.0 trở lên. Trong khi Sherlock thì chung chung hơn.

Dưới đây bạn có thể thấy các nguồn ứng dụng.

Tệp xml menu giống nhau:

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

Hoạt động tương thích:

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;
     }
}

Hoạt động của 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);
    }

}

Một cấu hình bổ sung là cần thiết trên ứng dụng sherlock:

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

CẬP NHẬT: như @ rudy-s đã nói, với thư viện hỗ trợ Android mới nhất (api 18), tôi thấy họ đã có hỗ trợ tích hợp cho thanh hành động (được gọi là lớp ActionBarCompat).


5
Trên thực tế, điều này không hoàn toàn chính xác. Thư viện Compat có thể và cung cấp cho bạn triển khai ActionBar trên Gingerbread. Ví dụ, ứng dụng này cung cấp cho bạn AB trên GB và không sử dụng Sherlock mà là Compat. play.google.com/store/apps/details?id=uk.co.mxdata.rootle
Hamid

Không cần thiết, nếu bạn lấy mẫu Actionbarcompat đó ra (ví dụ từ sdk android-17) và xây dựng nó trong ADT, nó sẽ chạy trên thiết bị GB có ActionBar. Tôi chỉ tự mình thử nghiệm để xác nhận trên Desire HD với 2.3.5.
Hamid

Ok, tôi hiểu rồi Tuy nhiên, ActionBarSherlock cung cấp nhiều tính năng hơn phải không?
Bruno Mateus

2
Với thư viện hỗ trợ Android mới nhất (api 18), tôi thấy họ đã có hỗ trợ tích hợp cho thanh hành động (được gọi là lớp ActionBarCompat).
thô lỗ

Gừng râu? Yêu nó.
Carlos P

39

Actionbar Sherlock tiên tiến hơn và tham vọng hơn nhiều so với dự án tương thích Actionbar đơn giản.

Khả năng tương thích của thanh Hành động có thể được coi là "mẫu" hoặc điểm khởi đầu tốt nếu bạn chỉ muốn đập một Thanh Hành động trên đầu ứng dụng của mình.

ActionBarSherlock xây dựng trên thư viện tương thích và cung cấp cho bạn (như mẫu tương thích thanh hành động) một Action Bar trên các thiết bị trước 3.0. Ngoài ra, nó có các tính năng bổ sung không có trong mã ActionBar Compat. Điều này bao gồm các tính năng như, nhưng không giới hạn

  • setNavlationMode (cho Tab và spinners trong thanh hành động)
  • Đoạn thoại
  • Thanh hành động theo ngữ cảnh (CAB) một menu chiếm thanh hành động, được sử dụng ví dụ cho đa lựa chọn (http://developer.android.com/design/potypes/new-4-0.html) Đây là tính năng ICS ( !) Đối với điều này, việc triển khai lớp ActionMode (được giới thiệu trong API cấp 11) phải được đưa vào thư viện ActionbarSherlock
  • Việc triển khai Fragment và FragmentActivity - vì các đoạn có thể thực hiện menu onCreateOptions, chúng tôi cần đảm bảo rằng SupportMothyInflater được sử dụng.
  • Hai chủ đề không giống với Holo.Dark và Holo.Light (Theme.Sherlock, Theme.Sherlock.Light)
  • Tính năng ICS "thanh hành động phân tách"

Nhược điểm duy nhất tôi thấy khi sử dụng ActionbarSherlock là bạn tự khóa mình vào thư viện đó. Nếu vì một lý do nào đó, nó sẽ chết trong tương lai gần, bạn sẽ phải tự duy trì nó (ví dụ nếu không có triển khai Jellybean đi kèm). Đây là một rắc rối (không phải là một vấn đề lớn) vì tất cả các mảnh vỡ của bạn đều mở rộng SherlockFragemnt và tất cả các Hoạt động của bạn. SherlockActivity.


Tui bỏ lỡ điều gì vậy? Có vẻ như đa lựa chọn KHÔNG hỗ trợ trong ABS
jiduvah

1
Xin lỗi về sự chậm trễ. Đa lựa chọn không phải do chính nó hỗ trợ. Nhưng, bạn có thể triển khai Multiselect bằng cách sử dụng "ActionMode" của ABS, vì ABS có các triển khai riêng của các lớp ActionMode. Khi đi vào "chế độ đa lựa chọn", Bạn sẽ đặt chế độ lựa chọn của ListView thành CHOICE_MODE_MULTIPLE và gọi ActionMode bằng cách gọi getSherlockActivity (). StartActionMode (gọi lại)
Glenn Bech

26

Vâng, việc triển khai @Jake đi xa hơn so với những gì mà Actionbar compat, chính xác hơn là Actionbar Compat chỉ là một ví dụ cơ bản về cách bạn có thể hỗ trợ tất cả các ứng dụng với một thanh hành động giả để phát hành trước Honeycomb (API 13). Mặc dù mục tiêu của chúng là cùng một thanh hành động tương thích chéo, chúng có cách tiếp cận khác nhau.

ActionbarCompat Aproach

Việc triển khai này không sử dụng thư viện hỗ trợ Tương thích Android thay vào đó, nó tạo ra một lớp cơ sở có tên ActionBarActivity tạo một phiên bản duy nhất của Trình trợ giúp mà trình trợ giúp này đóng vai trò là nhà máy trả về triển khai khác cho ba phân đoạn APIS, nó trả về

Phần thú vị nhất là trong ActionbarBaseHelper , vì nó có mã quan trọng nhất, tôi khuyên bạn nên hiểu lớp này và bạn sẽ lấy toàn bộ ví dụ.

Thanh hành động Sherlock

Chà, điều này là khó khăn trước tiên bởi vì, tôi không phải là tác giả có lẽ Jake có thể giải thích thêm về điều này, nhưng tôi sẽ thử.

Giống như Sherlock compat thực hiện khác nhau, nhưng một là cho "Compat" và cái còn lại là Bản địa. Nó buộc bạn phải mở rộng từ SherlockActivity hoặc từ SherlockFragmentActivity, bởi vì hai lớp cơ sở này có phương thức để gửi ActionBar.

Đây là một dự án lớn và phức tạp, không thể giải thích trong một bài. Đề nghị bạn đào xung quanh replock Sherlock Github hãy xem và như Jeff Atwood nói

nhập mô tả hình ảnh ở đây


10
  • Tôi tin tưởng mạnh mẽ rằng bạn nên sử dụng ActionBarCompatcho tất cả các dự án mới muốn hỗ trợ các thiết bị cũ hơn.

  • Nó cũng có thể có ý nghĩa để di chuyển các dự án hiện có. Vì vậy, hãy đọc tiếp để tìm hiểu lý do tại sao bạn nên di chuyển hoặc sử dụng ActionBarCompat ngay lập tức và cách di chuyển các dự án hiện có.

Tại sao bạn nên thích ActionBarCompat hơn ActionBarSherlock?

Có nhiều lý do tại sao bạn nên thích ActionbarCompat hơn ActionbarSherlock.

  1. Trước hết, dự án này là của Google, là một phần của Thư viện hỗ trợ và do đó có khả năng sẽ hỗ trợ các nội dung liên quan đến Action Bar mới đồng thời Google phát hành chúng với Android stock.

  2. Một lý do chính đáng khác là nó hỗ trợ Navigation Drawer patternquyền ra khỏi hộp, trong khi ActionBarSherlock thì không. Do đó, nếu bạn muốn thêm ngăn kéo này vào một dự án / ứng dụng hiện có, bạn nên di chuyển.

  3. Điều cuối cùng và quan trọng là, người tạo ra ActionBarSherlock, Jake Wharton, đã thông báo trên Google+ rằng việc phát triển thêm ActionBarSherlock đã bị dừng lại. ActionBarSherlock 4.4 là bản phát hành cuối cùng và có thể sửa lỗi - nhưng sẽ không có bất kỳ tính năng mới nào: Vì vậy, nếu chức năng mới được đưa vào thanh hành động, bạn có thể không theo kịp với Actionbarsherlock.


7

Có lẽ chúng ta nên cập nhật câu trả lời vì google đã xuất bản hỗ trợ Actionbar chính thức kể từ API18 ?

khối bên dưới là từ blog chính thức về hai thư viện này:

Nếu bạn đang sử dụng giải pháp của bên thứ ba (chẳng hạn như ActionBarSherlock), có một vài lý do để xem xét nâng cấp:

  • Có thể được cập nhật khi API của Action Bar phát triển.
  • Hỗ trợ điều hướng tổ tiên tích hợp.
  • Sử dụng các khung Menu và các lớp MenuItem.
  • Tiếp tục sử dụng lớp Fragment của Thư viện hỗ trợ.
  • Hỗ trợ tích hợp cho ActionBarDrawerToggle để sử dụng với DrawerLayout.
  • Backport của PopupMothy.

ActionBarSherlock là một thư viện vững chắc và được thử nghiệm tốt, đã phục vụ các nhà phát triển rất tốt trong một thời gian dài. Nếu bạn đã sử dụng nó và hiện không yêu cầu bất kỳ điều nào ở trên thì không cần phải di chuyển.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.