Różnica między kompatybilnością ActionBarSherlock i ActionBar

156

Jaka jest różnica między kompatybilnością ActionBarSherlock i Action Bar

Kilka dni temu Google właśnie wydało kompatybilność ActionBar, która mnie tak zdezorientowała. Czy to, że Kompatybilność paska akcji działa tak samo jak ActionBarSherlock i czy kodowanie jest takie samo?

Przykład: Czy ikona aplikacji umożliwiająca nawigację „w górę” lub ActionBar.Tab jest obsługiwana w zgodności z paskiem akcji?

xDragonZ
źródło
12
Do Twojej wiadomości Napisałem o tym post na blogu Square: corner.squareup.com/2012/05/actionbarsherlock-as-a-base.html
Jake Wharton
3
youtube.com/… Tak myśli Google o ActionBarSherlock vs ActionBarCompact
Rolf ツ
To ważny i przydatny wątek dla tych, którzy chcą przejść z ABS na ABCompat. Dzięki.
Ashokchakravarthi Nagarajan

Odpowiedzi:

61

ActionBarSherlock zapewnia aplikacji pasek akcji niezależnie * od wersji Android API, na której jest uruchomiona. Zgodność paska akcji zapewnia pasek akcji tylko wtedy, gdy urządzenie, na którym uruchamiasz, ma poziom interfejsu API 3.0 lub nowszy.

* Zwróć uwagę, że jeśli urządzenie, na którym używasz, nie jest w wersji 3.0 lub nowszej, ActionBarSherlock użyje własnej niestandardowej implementacji paska akcji, a nie natywnej.

--EDYTOWAĆ--

Wygląda na to, że coś się zmieniło i tak naprawdę nie ma już różnicy między ActionBarSherlock a kompatybilnością paska akcji. Aby uzyskać szczegółowe informacje, przeczytaj poniższe komentarze.

--EDYTOWAĆ--

Po użyciu obu teraz mogę powiedzieć, że tak naprawdę wolę ActionBarSherlock od kompatybilności z Action Bar. ActionBarSherlock jest naprawdę łatwy i przyjemny w użyciu.

--EDIT-- Jak wspomniano w LOG_TAG, istnieje teraz obsługa paska akcji w Bibliotece obsługi Androida. Nie miałem jeszcze okazji go użyć, ale wyobrażam sobie, że jest to najlepszy w użyciu.

Kurtis Nusbaum
źródło
1
@Anidamo Dzięki za ostrzeżenia. Mogę oszaleć, ale mógłbym przysiąc, że w pewnym momencie wersja w pakiecie kompatybilności z Androidem nie dała ci takiej, jeśli masz wersję przed 3.0. Zmodyfikowałem odpowiedź.
Kurtis Nusbaum
35
Również odpowiedź jest całkowicie błędna - przykład zgodności ma na celu obsługę urządzeń w wersji starszej niż 3.0.
AlikElzin-kilaka
8
Firma Google wydała nową, kompatybilną wstecz implementację paska akcji o nazwie ActionBarCompat, która jest częścią biblioteki obsługi r18. Interfejsy API ActionBarCompat pozwalają zbudować niezbędny wzorzec projektowy paska akcji w aplikacji, z szeroką kompatybilnością z powrotem do systemu Android 2.1.
LOG_TAG
3
Poniższy link mówi, whyoraz howdo korzystania z nowego ActionBarCompat API android-developers.blogspot.in/2013/08/...
Venom
2
Wystarczy dodać, że dla tych, którzy uważają, że mogą chcieć integracji Chromecasta w swojej aplikacji, gorąco polecam korzystanie z biblioteki appcompat. API MediaRouter wymagane do integracji Chromecasta zależy od appcompat; Nie można użyć ActionBarSherlock.
clu
113

ActionBarSherlock vs ActionBarCompat:

Chcę tylko umieścić kilka różnic w kodzie między ActionBarSherlock a ActionBarCompat Lib

 ActionBarSherlock vs ActionBarCompat ** silny tekst **

Możemy przenieść niektóre aplikacje z ActionBarSherlock do ActionBarCompat:

kroki:

  1. Importuj projekt AppCompat .

  2. Wymień SherlockFragmentActivitysię ActionBarActivity.

  3. Wymień SherlockFragmentsię Fragment.

  4. Zmiana Menu, MenuItemi getSupportMenuInflater()referencje. Zmodyfikuj sposób uzyskiwania widoków akcji.

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. Zmodyfikuj motywy i style .

Aby uzyskać więcej informacji, zapoznaj się z tymi slajdami przez + NickButcher (Google)

wprowadź opis obrazu tutaj

Podziękowania dla źródeł: http://gmariotti.blogspot.in/2013/07/actionbarsherlock-vs-actionbarcompat.html http://antonioleiva.com/actionbarcompat-migrating-actionbarsherlock/

Nie zapomnij przeczytać tego developer.android, aby dowiedzieć się więcej o ABC!

Uwaga: ustawienie go do testów jednostkowych w taki sam sposób jak ABS nie jest niestety możliwe w przypadku biblioteki obsługi.

Wynik:

wprowadź opis obrazu tutaj

Kredyty: Gabriele Mariotti

LOG_TAG
źródło
1
Tylko aktualizacja, że ​​ABS można teraz dodać do projektów Gradle compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'i nie musi to być projekt biblioteki.
ankushg
Dzięki za szczegółowe wyjaśnienie
Biswajit Das
41

Kończąc tylko to, co @Kurtis Nusbaum, na praktycznym przykładzie.

AKTUALIZACJA: jak powiedział @ rudy-s, z najnowszą biblioteką obsługi Androida (api 18), widziałem, że mają już wbudowaną obsługę paska akcji (zwaną klasą ActionBarCompat).

Zbudowałem dwie proste aplikacje, aby pokazać wizualną różnicę między ActionBarSherlock i ActionBar Compatibility. Zobacz zdjęcia porównawcze:

Aplikacja korzystająca z biblioteki zgodności

Aplikacja korzystająca z biblioteki Sherlock

Teraz wygląd po naciśnięciu przycisku menu:

Naciśnięto aplikację korzystającą z kompatybilności w menu

Aplikacja za pomocą Sherlocka w menu wciśniętym


Jak widać, obrazy po prostu narzucają to, co zostało powiedziane. Zgodność paska akcji zapewnia pasek akcji tylko wtedy, gdy urządzenie, na którym uruchamiasz, ma poziom interfejsu API 3.0 lub nowszy. Podczas gdy Sherlock jest bardziej ogólny.

Poniżej możesz zobaczyć źródło aplikacji.

Plik XML menu jest taki sam:

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

Działalność w zakresie zgodności:

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

Działalność Sherlocka:

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

}

Wymagana była dodatkowa konfiguracja w aplikacji Sherlock:

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

AKTUALIZACJA: jak powiedział @ rudy-s, z najnowszą biblioteką obsługi Androida (api 18), widziałem, że mają już wbudowaną obsługę paska akcji (zwaną klasą ActionBarCompat).

Bruno Mateus
źródło
5
W rzeczywistości nie jest to całkowicie poprawne. Biblioteka Compat może i zapewnia implementację ActionBar w Gingerbread. Na przykład ta aplikacja daje AB na GB i nie używa Sherlocka, ale Compat. play.google.com/store/apps/details?id=uk.co.mxdata.rootle
Hamid
Nie ma potrzeby, jeśli wyciągniesz tę próbkę actionbarcompat (na przykład z zestawu SDK systemu Android-17) i zbudujesz ją w ADT, będzie działać na urządzeniu GB z ActionBar. Właśnie przetestowałem to osobiście, aby potwierdzić na Desire HD z 2.3.5.
Hamid
Ok, rozumiem. Jednak ActionBarSherlock zapewnia więcej funkcji, prawda?
Bruno Mateus
2
Dzięki najnowszej bibliotece obsługi systemu Android (api 18) zauważyłem, że mają już wbudowaną obsługę paska akcji (zwaną klasą ActionBarCompat).
rudy s
GingerBEARD? Kocham to.
Carlos P,
39

Actionbar Sherlock jest znacznie bardziej zaawansowany i ambitniejszy niż prosty projekt kompatybilności z Actionbar.

Kompatybilność paska akcji może być uważana za „próbkę” lub dobry punkt wyjścia, jeśli chcesz tylko uderzyć w pasek akcji u góry swojej aplikacji.

ActionBarSherlock opiera się na bibliotece zgodności i zapewnia (podobnie jak przykład zgodności paska akcji) pasek akcji na urządzeniach starszych niż 3.0. Ponadto ma dodatkowe funkcje, których nie ma w kodzie ActionBar Compat. Obejmuje to takie funkcje, jak między innymi

  • setNavigationMode (dla kart i spinnerów na pasku akcji)
  • Fragmenty okien dialogowych
  • Contextual Action Bar (CAB) menu, które przejmuje pasek działań, używane na przykład do wielokrotnego wyboru (http://developer.android.com/design/patterns/new-4-0.html) To jest funkcja ICS ( !) W tym celu do biblioteki ActionbarSherlock musiała zostać wprowadzona implementacja klasy ActionMode (wprowadzona na poziomie API 11)
  • Implementacje Fragment i FragmentActivity - ponieważ fragmenty mogą implementować menu onCreateOptions, musimy upewnić się, że jest używane SupportMenuInflater.
  • Dwa motywy podobne do Holo.Dark i Holo.Light (Theme.Sherlock, Theme.Sherlock.Light)
  • Funkcja ICS „podzielony pasek działań”

Jedyną wadą, jaką widzę w używaniu ActionbarSherlock, jest to, że zamykasz się w tej bibliotece. Jeśli z jakiegoś powodu wymrze w najbliższej przyszłości, będziesz musiał sam go utrzymywać (na przykład, jeśli nie pojawi się implementacja Jellybean). Jest to kłopotliwe (nie jest to duży problem), ponieważ wszystkie twoje fragmenty obejmują SherlockFragemnt i wszystkie twoje działania. SherlockActivity.

Glenn Bech
źródło
Czy coś mi brakuje? Wygląda na to, że wybór wielokrotny NIE jest obsługiwany w ABS
jiduvah
1
Przepraszam za opóźnienie. Funkcja wyboru wielokrotnego nie jest obsługiwana samodzielnie przez ABS. Można jednak zaimplementować Multiselect za pomocą ABS „ActionMode”, ponieważ ABS ma własne implementacje klas ActionMode. Przechodząc do „trybu wyboru wielokrotnego”, można ustawić tryb wyboru ListView na CHOICE_MODE_MULTIPLE i wywołać ActionMode, wywołując metodę getSherlockActivity (). StartActionMode (callback)
Glenn Bech
26

Cóż, implementacja @Jake idzie o wiele dalej niż to, co jest kompatybilne z Actionbar, a dokładniej Actionbar Compat to tylko podstawowy przykład tego, jak można obsługiwać wszystkie aplikacje za pomocą pseudo-actionbar dla wydań wcześniejszych niż Honeycomb (API 13). Chociaż ich celem jest ten sam pasek akcji kompatybilny z różnymi kombinacjami, mają inne podejście.

ActionbarCompat Aproach

Ta implementacja nie wykorzystuje wsparcia biblioteki Zgodność z Androidem zamiast tego utworzyć klasę bazową zwaną ActionBarActivity utworzyć pojedynczą instancję Helper ten akt jako pomocnik samej fabryce, która powraca zmierzających do wdrożenia trzech segmencie APIS, zwraca

Najciekawsza część znajduje się w ActionbarBaseHelper , ponieważ zawiera najważniejszy kod, sugeruję zrozumienie tej klasy, a otrzymasz cały przykład.

Pasek akcji Sherlock

Cóż, jest to trudne, ponieważ nie jestem autorem, może Jake mógłby to wyjaśnić dalej, ale spróbuję.

Tak jak kompatybilny Sherlock ma inną implementację, ale jedna jest dla "Compat", a druga jest natywna. Zmusza cię do rozszerzenia z SherlockActivity lub z SherlockFragmentActivity, ponieważ te dwie klasy podstawowe mają metodę wysyłania ActionBar.

To duży i złożony projekt, którego nie da się wyjaśnić w jednym poście. Zasugeruj, abyś przeszukał repozytorium Sherlocka Githuba, przyjrzyj się i jak mówi Jeff Atwood

wprowadź opis obrazu tutaj

Necronet
źródło
10
  • Głęboko wierzę, że powinieneś używać go ActionBarCompatdo wszystkich nowych projektów, które chcą obsługiwać starsze urządzenia.

  • Migracja istniejących projektów może mieć również sens. Czytaj dalej, aby dowiedzieć się, dlaczego należy od razu przeprowadzić migrację lub użyć ActionBarCompat oraz jak migrować istniejące projekty.

Dlaczego powinieneś preferować ActionBarCompat zamiast ActionBarSherlock?

Istnieje wiele powodów, dla których powinieneś preferować ActionbarCompat zamiast ActionbarSherlock.

  1. Przede wszystkim ten projekt jest autorstwa Google, jest częścią biblioteki wsparcia i dlatego prawdopodobnie będzie obsługiwał nowe rzeczy związane z Action Bar w tym samym czasie, gdy Google wypuszcza je z Androidem.

  2. Innym dobrym powodem jest to, że obsługuje on Navigation Drawer patternnatychmiast po wyjęciu z pudełka, podczas gdy ActionBarSherlock nie. Dlatego jeśli chcesz dodać tę szufladę do istniejącego projektu / aplikacji, powinieneś przeprowadzić migrację.

  3. Ostatnie i ważne jest to, że twórca ActionBarSherlock, Jake Wharton, ogłosił na Google+, że dalszy rozwój ActionBarSherlock został zatrzymany. ActionBarSherlock 4.4 jest ostatnią wersją i może zawierać poprawki błędów - ale nie będzie żadnych nowych funkcji: Więc jeśli nowa funkcjonalność jest zawarta w pasku akcji, możesz nie nadążyć za nią z actionbarsherlock.

Steve
źródło
7

Może powinniśmy zaktualizować odpowiedź, ponieważ Google opublikowało oficjalne wsparcie Actionbar od API18 ?

blok poniżej pochodzi z oficjalnego bloga o tych dwóch bibliotekach:

Jeśli korzystasz z rozwiązania innej firmy (takiego jak ActionBarSherlock), istnieje kilka powodów, dla których warto rozważyć aktualizację:

  • Może być aktualizowany wraz z rozwojem interfejsu API paska akcji.
  • Zintegrowana obsługa nawigacji Ancestral.
  • Wykorzystanie ramowych klas Menu i MenuItem.
  • Kontynuuj używanie klasy Fragment biblioteki pomocy technicznej.
  • Zintegrowana obsługa ActionBarDrawerToggle do użytku z DrawerLayout.
  • Backport PopupMenu.

ActionBarSherlock to solidna i sprawdzona biblioteka, która przez długi czas bardzo dobrze służyła programistom. Jeśli już go używasz i obecnie nie potrzebujesz żadnego z powyższych, nie ma potrzeby migracji.

Ruidge
źródło