Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Android : migrer d’actionBarSherlock à actionBarCompat

3 septembre 2013

Cet article fait suite à mon précédent billet expliquant comment intégrer la bibliothèque actionBarCompat dans vos projets.

Dans ce nouvel article nous allons voir comment migrer vos anciens projets sur actionBarSherlock vers actionBarCompat.

Importer actionBarCompat

La première étape consiste à importer la bibliothèque actionBarCompat dans votre projet Android. Pour ce faire, vous pouvez consulter la première partie de cet article : http://blog.rolandl.fr/1522-android-mise-en-place-de-lactionbarcompat-et-du-navigation-drawer.

Les Activity

Si vous utilisez actionBarSherlock, vos Activity doivent normalement hériter de la classe SherlockFragmentActivity ou SherlockActivity suivant que vous utilisez ou non des fragments. Avec actionBarCompat vos Activity doivent hériter de la classe ActionBarActivity. Pas de panique, vous pouvez utiliser ou non des fragments avec ce nouvel héritage !

Les fragments

Si vous utilisez actionBarSherlock, vos fragments héritent normalement de la classe SherlockFragment. Avec actionBarCompat, vos fragments doivent maintenant hériter de la classe Fragment disponible dans la bibliothèque de compatibilité v4.

Les menus

Les items

Si actionBarSherlock utilise ses propres classes, actionBarCompat utilisent les classes natives pour gérer les menus. Il vous suffit donc de changer les imports actionBarSherlock par les imports android natif.

Ainsi, remplacez :

import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

par :

import android.view.Menu;
import android.view.MenuItem;

L’inflater

Toujours dans les menus, vous pouvez noter qu’il n’est plus nécessaire d’utiliser la méthode getSupportMenuInflater(). Vous pouvez utiliser directement la méthode getMenuInflater().

Les actionView

Nous allons maintenant revenir sur les actionView.

Avant vous utilisiez la méthode getActionView() ou setActionView() de votre MenuItem. Par exemple :

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    if(R.id.refresh == item.getItemId()) {
        item.setActionView(R.layout.progressbar);
    }

    return super.onOptionsItemSelected(item);
}

Avec actionBarCompat, il vous faudra dorénavant utiliser les méthodes statiques getActionView() ou setActionView() de la classe MenuItemCompat. Par exemple :

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    if(R.id.refresh == item.getItemId()) {
        MenuItemCompat.setActionView(item, R.layout.progressbar);
    }

    return super.onOptionsItemSelected(item);
}

L’attribut showAsAction

Pour finir avec les menus, nous allons revenir sur l’utilisation de l’attribut showAsAction lors de la création du fichier xml d’un menu.

Avec actionBarSherlock, voici ce que vous auriez écrit :

<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:id="@+id/refresh"
    android:icon="@drawable/ic_navigation_refresh"
    android:title="@string/ac_refresh"
    android:showAsAction="always"
  />
</menu>

Avec actionBarCompat, nous devons déclarer notre propre namespace XML. Voici ce que ça donne pour pouvoir utiliser cet attribut :

<menu
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:myApp="http://schemas.android.com/apk/res-auto"
>
  <item
    android:id="@+id/refresh"
    android:icon="@drawable/ic_navigation_refresh"
    android:title="@string/ac_refresh"
    myApp:showAsAction="always"
  />
</menu>

Le thème

La dernière étape consiste à modifier le thème de votre application.

Avec actionBarSherlock, votre thème ressemblait à quelque chose comme ça :

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

Avec actionBarCompat, votre thème ressemble maintenant à ça :

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> ... </style>

Commentaires