Différence entre la compatibilité ActionBarSherlock et ActionBar

156

Quelle est la différence entre ActionBarSherlock et la compatibilité de la barre d'action

Il y a quelques jours, Google vient de publier la compatibilité ActionBar qui me rend si confus. Est-ce que la compatibilité de la barre d'action fonctionne de la même manière que l'ActionBarSherlock et le codage est-il le même?

Exemple: l' icône de l'application pour naviguer «vers le haut» ou ActionBar.Tab est-il pris en charge dans la compatibilité de la barre d'action?

xDragonZ
la source
12
Pour info, j'ai écrit un article à ce sujet pour le blog eng de Square: corner.squareup.com/2012/05/actionbarsherlock-as-a-base.html
Jake Wharton
3
youtube.com/... Voici ce que Google pense d'ActionBarSherlock vs ActionBarCompact
Rolf ツ
C'est un fil conducteur important et utile pour ceux qui souhaitent migrer d'ABS vers ABCompat. Merci.
Ashokchakravarthi Nagarajan

Réponses:

61

ActionBarSherlock donne à votre application une barre d'action quelle que soit * la version de l'API Android sur laquelle votre application est exécutée. La compatibilité de la barre d'action vous donne la barre d'action uniquement si l'appareil sur lequel vous exécutez est de niveau API 3.0 ou supérieur.

* Notez que si l'appareil sur lequel vous exécutez n'est pas version 3.0 ou supérieure, ActionBarSherlock utilisera sa propre implémentation personnalisée de la barre d'actions, pas une implémentation native.

--ÉDITER--

Il semble que les choses ont changé et qu'il n'y a plus de différence entre ActionBarSherlock et la compatibilité de la barre d'action. Veuillez lire les commentaires ci-dessous pour plus de détails.

--ÉDITER--

Après avoir utilisé les deux maintenant, je peux dire que je préfère en fait ActionBarSherlock à la compatibilité Action Bar. ActionBarSherlock est vraiment facile et agréable à utiliser.

--EDIT-- Comme mentionné par LOG_TAG, la barre d'action est désormais prise en charge dans la bibliothèque de support Android. Je n'ai pas encore eu l'occasion de l'utiliser, mais j'imagine que c'est la meilleure à utiliser.

Kurtis Nusbaum
la source
1
@Anidamo Merci pour la mise en garde. Je deviens peut-être fou, mais je pourrais jurer qu'à un moment donné, la version du pack de compatibilité Android ne vous en a pas donné une si vous aviez la version antérieure à 3.0. J'ai modifié ma réponse.
Kurtis Nusbaum du
35
De plus, la réponse est totalement erronée - le but de l'exemple de compatibilité est de prendre en charge les appareils antérieurs à 3.0.
AlikElzin-kilaka
8
Google a publié une nouvelle implémentation de la barre d'action rétrocompatible appelée ActionBarCompat qui fait partie de la bibliothèque de support r18. Les API ActionBarCompat vous permettent de créer le modèle de conception essentiel de la barre d'action dans votre application, avec une large compatibilité avec Android 2.1.
LOG_TAG
3
Le lien suivant vous indique whyet commenthow utiliser la nouvelle API ActionBarCompat, android-developers.blogspot.in/2013/08/…
VenoM
2
Juste pour ajouter, pour ceux qui pensent vouloir l'intégration de Chromecast dans leur application, je recommande vivement d'utiliser la bibliothèque appcompat. Les API MediaRouter nécessaires à l'intégration de Chromecast dépendent de l'appcompat; ActionBarSherlock ne peut pas être utilisé.
clu
113

ActionBarSherlock vs ActionBarCompat:

Je veux juste mettre quelques différences de code entre ActionBarSherlock et ActionBarCompat Lib

 ActionBarSherlock vs ActionBarCompat ** texte fort **

Nous pouvons migrer certaines applications d'ActionBarSherlock vers ActionBarCompat:

pas:

  1. Importer projet AppCompat .

  2. Remplacer SherlockFragmentActivityparActionBarActivity .

  3. Remplacer SherlockFragmentparFragment .

  4. Changement Menu, MenuItemet les getSupportMenuInflater()références. Modifiez la façon dont vous obtenez les vues d'action.

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. Modifiez vos thèmes et styles .

Pour plus d'informations, veuillez consulter ces diapositives de + NickButcher (Google)

entrez la description de l'image ici

Merci aux sources: http://gmariotti.blogspot.in/2013/07/actionbarsherlock-vs-actionbarcompat.html http://antonioleiva.com/actionbarcompat-migrating-actionbarsherlock/

N'oubliez pas de lire ceci developer.android pour en savoir plus sur ABC!

Remarque: la configuration pour les tests unitaires de la même manière que l'ABS n'est malheureusement pas possible avec la bibliothèque de support.

Production:

entrez la description de l'image ici

Crédits: Gabriele Mariotti

LOG_TAG
la source
1
Juste une mise à jour que l'ABS peut maintenant également être ajouté aux projets Gradle via compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'et n'a pas besoin d'être un projet de bibliothèque.
ankushg
Merci pour l'explication détaillée
Biswajit Das
41

Je viens de compléter ce que @Kurtis Nusbaum avec un exemple pratique.

MISE À JOUR: comme @ rudy-s l'a dit, avec la dernière bibliothèque de support Android (api 18), j'ai vu qu'ils avaient déjà un support intégré pour la barre d'action (appelée classe ActionBarCompat).

J'ai créé deux applications simples pour montrer la différence visuelle entre ActionBarSherlock et ActionBar Compatibility. Voir les images comparatives:

Application utilisant la bibliothèque de compatibilité

Application utilisant la bibliothèque Sherlock

Maintenant, l'apparence lorsque le bouton de menu est enfoncé:

App utilisant la compatibilité sur le menu enfoncé

App utilisant Sherlock sur le menu enfoncé


Comme vous pouvez le voir, les images ne font que renforcer ce qui a été dit. La compatibilité de la barre d'action vous donne la barre d'action uniquement si l'appareil sur lequel vous exécutez est de niveau API 3.0 ou supérieur. Alors que Sherlock est plus général.

Ci-dessous, vous pouvez voir la source de l'application.

Le fichier xml du menu est le même:

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

Activité de compatibilité:

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

Activité de 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);
    }

}

Une configuration supplémentaire était nécessaire sur l'application sherlock:

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

MISE À JOUR: comme @ rudy-s l'a dit, avec la dernière bibliothèque de support Android (api 18), j'ai vu qu'ils avaient déjà un support intégré pour la barre d'action (appelée classe ActionBarCompat).

Bruno Mateus
la source
5
En fait, ce n'est pas tout à fait correct. La bibliothèque Compat peut, et vous donne une implémentation ActionBar sur Gingerbread. Cette application par exemple vous donne un AB sur GB et n'utilise pas Sherlock mais Compat. play.google.com/store/apps/details?id=uk.co.mxdata.rootle
Hamid
Il n'est pas nécessaire, si vous extrayez cet exemple d'actionbarcompat (par exemple hors du sdk android-17) et que vous le construisez dans ADT, il fonctionnera sur un appareil GB avec une ActionBar. Je viens de le tester moi-même pour confirmer sur un Desire HD avec 2.3.5.
Hamid
OK j'ai compris. Cependant, ActionBarSherlock fournit plus de fonctionnalités, n'est-ce pas?
Bruno Mateus
2
Avec la dernière bibliothèque de support Android (api 18), j'ai vu qu'ils avaient déjà un support intégré pour la barre d'action (appelée classe ActionBarCompat).
rudy s
GingerBEARD? Aimer.
Carlos P
39

Actionbar Sherlock est beaucoup plus avancé et beaucoup plus ambitieux que le simple projet de compatibilité Actionbar.

La compatibilité de la barre d'action peut être considérée comme un «exemple» ou un bon point de départ si vous souhaitez seulement claquer une barre d'action au-dessus de votre application.

ActionBarSherlock s'appuie sur la bibliothèque de compatibilité et vous donne (comme l'exemple de compatibilité de la barre d'action) une barre d'action sur les appareils antérieurs à 3.0. En outre, il possède des fonctionnalités supplémentaires non présentes dans le code de compatibilité ActionBar. Cela inclut des fonctionnalités telles que, mais sans s'y limiter

  • setNavigationMode (pour les onglets et les flèches dans la barre d'actions)
  • Fragments de dialogue
  • Barre d'action contextuelle (CAB) un menu qui reprend la barre d'action, utilisé par exemple pour la sélection multiple (http://developer.android.com/design/patterns/new-4-0.html) Il s'agit d'une fonctionnalité ICS ( !) Pour cela, une implémentation de la classe ActionMode (introduite au niveau de l'API 11) a dû être introduite dans la bibliothèque ActionbarSherlock
  • Implémentations Fragment et FragmentActivity - étant donné que les fragments peuvent implémenter le menu onCreateOptions, nous devons nous assurer que SupportMenuInflater est utilisé.
  • Deux thèmes pas très différents de Holo.Dark et Holo.Light (Theme.Sherlock, Theme.Sherlock.Light)
  • La fonction ICS "barre d'action fractionnée"

Le seul inconvénient que je vois en utilisant ActionbarSherlock est que vous vous enfermez dans cette bibliothèque. Si, pour une raison quelconque, il s'éteint dans un proche avenir, vous devrez le maintenir vous-même (par exemple si aucune implémentation de Jellybean n'est disponible). C'est un problème (pas un gros problème) puisque tous vos fragments étendent SherlockFragemnt et toutes vos activités. SherlockActivity.

Glenn Bech
la source
Est-ce que je manque quelque chose? Il semble que la sélection multiple ne soit PAS prise en charge en ABS
jiduvah
1
Désolé pour le retard. La sélection multiple n'est pas prise en charge par l'ABS en soi. Mais vous pouvez implémenter Multiselect en utilisant l'ABS "ActionMode", car ABS a ses propres implémentations des classes ActionMode. Lors du passage en "mode de sélection multiple", vous définiriez le mode de choix de ListView sur CHOICE_MODE_MULTIPLE, et invoqueriez ActionMode en appelant getSherlockActivity (). StartActionMode (callback)
Glenn Bech
26

Eh bien, l'implémentation de @Jake va bien plus loin que la compatibilité de la barre d'action, pour être plus précis, la compatibilité de la barre d'action n'est qu'un exemple de base sur la façon dont vous pouvez prendre en charge toutes les applications avec une pseudo-barre d'action pour les versions antérieures de Honeycomb (API 13). Bien que leur cible soit la même barre d'action compatible croisée, ils ont une approche différente.

ActionbarCompat Aproach

Cette implémentation n'utilise pas la bibliothèque de support de compatibilité Android à la place, elle crée une classe de base appelée ActionBarActivity crée une seule instance d'un Helper cet assistant agit comme une fabrique elle-même qui renvoie une implémentation différente pour les trois segments d'APIS, il retourne

La partie la plus intéressante est dans le ActionbarBaseHelper , car il a le code le plus important, je vous suggère de comprendre cette classe et vous obtiendrez l'exemple complet.

Barre d'action Sherlock

Eh bien, c'est délicat d'abord parce que, je ne suis pas l'auteur, peut-être que Jake peut l'expliquer davantage, mais je vais essayer.

Tout comme le compat Sherlock fait des implémentations différentes mais l'une est pour "Compat" et l'autre est native. Cela vous oblige à étendre soit de SherlockActivity, soit de SherlockFragmentActivity, car ces deux classes de base ont la méthode pour distribuer l'ActionBar.

Il s'agit d'un projet vaste et complexe, qui ne peut être expliqué dans un seul article. Vous suggère creusez Sherlock Github repo saisir un regard et comme Jeff Atwood dit

entrez la description de l'image ici

Nécronet
la source
10
  • Je crois fermement que vous devriez l'utiliser ActionBarCompatpour tous les nouveaux projets qui souhaitent prendre en charge des appareils plus anciens.

  • Il peut également être judicieux de migrer des projets existants. Alors lisez la suite pour savoir pourquoi vous devez migrer ou utiliser ActionBarCompat immédiatement et comment migrer des projets existants.

Pourquoi devriez-vous préférer ActionBarCompat à ActionBarSherlock?

Il existe de nombreuses raisons pour lesquelles vous devriez préférer ActionbarCompat à ActionbarSherlock.

  1. Tout d'abord, ce projet est de Google, fait partie de la bibliothèque de support et prendra donc probablement en charge de nouveaux éléments liés à la barre d'action en même temps que Google les publie avec Android.

  2. Une autre bonne raison est qu'il prend en charge le Navigation Drawer patterntout de suite, contrairement à ActionBarSherlock. Ainsi, si vous souhaitez ajouter ce tiroir à un projet / application existant, vous devez migrer.

  3. Le dernier et important est que le créateur d'ActionBarSherlock, Jake Wharton, a annoncé sur Google+ que le développement ultérieur d'ActionBarSherlock a été arrêté. ActionBarSherlock 4.4 est la dernière version et pourrait obtenir des corrections de bogues - mais il n'y aura pas de nouvelles fonctionnalités: Donc, si une nouvelle fonctionnalité est incluse dans la barre d'action, vous ne pouvez pas la suivre avec actionbarsherlock.

Steve
la source
7

Peut-être devrions-nous mettre à jour la réponse car Google a publié le support officiel de la barre d'action depuis l' API18 ?

Le bloc ci-dessous provient du blog officiel sur ces deux bibliothèques:

Si vous utilisez une solution tierce (telle que ActionBarSherlock), il existe plusieurs raisons d'envisager une mise à niveau:

  • Peut être mis à jour au fur et à mesure de l'évolution de l'API Action Bar.
  • Prise en charge intégrée de la navigation ancestrale.
  • Utilisation des classes Menu et MenuItem du framework.
  • Continuez à utiliser la classe Fragment de la bibliothèque de support.
  • Prise en charge intégrée d'ActionBarDrawerToggle pour une utilisation avec DrawerLayout.
  • Backport de PopupMenu.

ActionBarSherlock est une bibliothèque solide et bien testée qui a très bien servi les développeurs pendant longtemps. Si vous l'utilisez déjà et que vous n'avez actuellement besoin d'aucun des éléments ci-dessus, il n'est pas nécessaire de migrer.

ruidge
la source