web-dev-qa-db-fra.com

Définition du thème ActionBarSherlock pour Android

LIRE LA MISE À JOUR 2 CI-DESSOUS POUR LA RÉPONSE

J'essaie d'utiliser ActionBarSherlock dans mon application. J'ai extrait la version 4.0.0 du projet github repo , je l'ai construite dans Netbeans, puis j'ai copié le fichier library-4.0.0.jar dans le répertoire lib de mon projet (je n'utilise pas Eclipse) .

C'est juste une activité squelette en ce moment, et elle démarre très bien dans ICS, mais quand je l'exécute sur Gingerbread, je reçois l'exception suivante se plaignant que je n'ai pas le thème de l'application pour Theme.Sherlock (ou similaire):

Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arashpayan.prayerbook/com.arashpayan.prayerbook.PrayerBook}: Java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1647)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1663)
    at Android.app.ActivityThread.access$1500(ActivityThread.Java:117)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:931)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:130)
    at Android.app.ActivityThread.main(ActivityThread.Java:3683)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:507)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:839)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:597)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.
    at com.actionbarsherlock.internal.ActionBarSherlockCompat.generateLayout(ActionBarSherlockCompat.Java:987)
    at com.actionbarsherlock.internal.ActionBarSherlockCompat.installDecor(ActionBarSherlockCompat.Java:899)
    at com.actionbarsherlock.internal.ActionBarSherlockCompat.setContentView(ActionBarSherlockCompat.Java:852)
    at com.actionbarsherlock.ActionBarSherlock.setContentView(ActionBarSherlock.Java:655)
    at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.Java:316)
    at com.arashpayan.prayerbook.PrayerBook.onCreate(PrayerBook.Java:44)
    at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1611)
    ... 11 more

La ligne dont il se plaint (PrayerBook: 44) est l'appel à setContentView. L'application se compose simplement d'une seule activité avec une méthode onCreate() que j'appelle setTheme() en haut:

public void onCreate(Bundle savedInstanceState)
{
        setTheme(com.actionbarsherlock.R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);

        TextView rootTextView = new TextView(this);
        rootTextView.setText("Hello, world!");
        setContentView(rootTextView);

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.Tab tab = getSupportActionBar().newTab();
        tab.setText("Prayers");
        getSupportActionBar().addTab(tab);

        tab = getSupportActionBar().newTab();
        tab.setText("Recents");
        getSupportActionBar().addTab(tab);

        tab = getSupportActionBar().newTab();
        tab.setText("Bookmarks");
        getSupportActionBar().addTab(tab);
}

Je dois définir le thème incorrectement, mais je ne vois pas comment. Quelqu'un peut-il aider?

MISE À JOUR Ci-dessous, CommonsWare a noté que le thème peut être défini dans AndroidManifest.xml. J'ai essayé ça comme ça:

<application Android:label="@string/app_name" Android:icon="@drawable/icon" Android:theme="@style/Theme.Sherlock">
        <activity Android:name="PrayerBook"
                  Android:label="@string/app_name"
                  Android:configChanges="orientation|keyboardHidden|screenLayout|uiMode|mcc|mnc|locale|navigation|fontScale|screenSize">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            Android:name="LanguagesActivity" />
</application>

mais Ant me donne une erreur quand il essaie de construire l'application:

/Users/arash/coding/prayerbook/AndroidManifest.xml:7: error: Error: No resource found that matches the given name (at 'theme' with value '@style/Theme.Sherlock').

MISE À JOUR 2 Avec l'aide de CommonsWare dans ses commentaires de suivi, j'ai pu le faire fonctionner. J'avais besoin d'ajouter ActionBarSherlock en tant que dépendance de projet. Faire cela,

1) J'ai supprimé library-4.0.0.jar Et Android-support-4.0.jar Du répertoire lib de mon projet.

2) Ensuite, accédez au dossier library à l'intérieur de la racine du répertoire ActionBarSherlock extrait de github. Tapez Android update project Pour qu'un fichier build.xml Et proguard.cfg Soit créé pour la bibliothèque.

3) Enfin, cd dans le répertoire principal du projet et ajoutez ABS en tant que dépendance de bibliothèque avec Android update project --path . --library ../ActionBarSherlock/library Le chemin d'accès au --library Dans la commande variera selon l'endroit où vous avez coché sur le repo. ActionBarSherlock et le répertoire de projet de mon application étaient des répertoires frères.

42
Arash Payan

Habituellement, vous définissez votre thème dans le manifeste, comme indiqué dans la Android (et lié à partir de la page de thème ActionBarSherlock ) .

Si vous souhaitez utiliser ActionBarSherlock partout dans votre application, cela fonctionne:

<application
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/Theme.Sherlock">
75
CommonsWare

Pour moi, cela était dû au fait de ne pas utiliser le @style/ préfixe. C'est à dire. j'ai eu

<style name="AppTheme" parent="Theme.Sherlock.Light" />

au lieu de

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

Ce qui est un peu bizarre parce que je jure que la valeur par défaut du modèle est quelque chose comme:

<style name="AppTheme" parent="Android:Theme.Holo.Light" />
19
Timmmm
<!--Provides resources-->
<dependency>
   <groupId>com.actionbarsherlock</groupId>
   <artifactId>library</artifactId>
   <version>4.1.0</version>
   <type>apklib</type>
</dependency>
<!-Provides import links-->
<dependency>
   <groupId>com.actionbarsherlock</groupId>
   <artifactId>library</artifactId>
   <version>4.1.0</version>
   <type>jar</type>
   <scope>provided</scope>
 </dependency>

L'astuce est d'utiliser le type "apklib", cela signifie que maven utilisera toutes les sources (ressources aussi). Une autre dépendance du fichier jar (portée "fournie") est utilisée pour établir un lien avec les classes sherlock pendant le codage.

3
Apple.Dragon

Eu le même problème. L'application s'est bloquée même si le thème a été défini dans le manifeste. La définition du thème par programme a résolu le problème:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
1
Apfelsaft

Cela m'arrivait à IntelliJ IDEA. J'ai résolu ce problème en allant dans Fichier> Structure du projet> Paramètres du projet> Facettes> Sélectionner le module actionbarsherlock dans la 2ème colonne> Cochez la case "Module de bibliothèque"> Appliquer et OK> Enregistrer et reconstruire.

UPDATE Après un examen plus approfondi, ma réponse d'origine peut être trop précise et ne fonctionnera probablement que dans certains cas. Cette erreur signifie que les dépendances n'ont pas été correctement configurées. Dans IntelliJ IDEA, procédez comme suit pour configurer correctement actionbarsherlock en tant que dépendance de module:

  1. Téléchargez et extrayez la bibliothèque actionbarsherlock du Zip (Remarque: vous n'avez besoin que du dossier "actionbarsherlock")
  2. Copiez-le et collez-le à côté de votre projet Android
  3. Ouvrez votre projet dans IntelliJ
  4. Fichier> Structure du projet> Paramètres du projet> Modules> Ajouter ("+" vert au-dessus de la deuxième colonne)> Module d'importation> Sélectionner le répertoire actionbarsherlock dans la boîte de dialogue du navigateur de fichiers> OK> Créer un module à partir de sources existantes> Suivant
  5. Décochez le dossier "test" pour qu'il ne soit pas ajouté au projet et cliquez sur "Suivant"
  6. Sous l'onglet Bibliothèques, Android-support-v4 doit être vérifié, cliquez sur "Suivant"
  7. Sous l'onglet Modules, actionbarsherlock doit être coché, cliquez sur "Suivant"
  8. S'il vous demande d'écraser actionbarsherlock.iml, choisissez "Écraser" puis "Terminer" (vous devriez être renvoyé à la section Modules de la boîte de dialogue Structure du projet)
  9. Sélectionnez le module actionbarsherlock dans la deuxième colonne et sous l'onglet Dépendances dans la troisième colonne, cochez "Exporter" à côté de la bibliothèque Android-support-v4
  10. Presque là!
  11. Maintenant, sélectionnez votre module de projet dans la deuxième colonne et sous l'onglet Dépendances, cliquez sur le bouton Ajouter ("+" vert à l'extrême droite de la boîte de dialogue)
  12. Sélectionnez Module Dependency et choisissez actionbarsherlock dans la boîte de dialogue qui apparaît et appuyez sur "OK"
  13. Cliquez maintenant sur "Appliquer" ou "OK" pour accepter les modifications

Cela devrait faire l'affaire.

1
kahmali

Si vous voulez utiliser un style personnalisé, j'ai fait un modèle de style ActionBarSherlock personnalisé. Le thème est défini dans le fichier /values/styles.xml. Il est étendu à partir du thème Theme.Sherlock.Light. Il existe de nombreux paramètres que vous pouvez définir: icône, logo, diviseur, titre, superposition d'ombre, boutons de menu d'action, menu contextuel, arrière-plan du mode d'action, navigation dans la liste déroulante, style d'onglet, options d'affichage, etc. Presque tout, ce dont vous avez besoin, pour créer votre thème de barre d'action personnalisé. J'utilise ce modèle dans mes applications, car il m'aide à styliser la barre d'action très rapidement.

Vous pouvez trouver ce modèle sur mon GitHub . C'est très simple à utiliser. Copiez simplement les valeurs et les directoires dessinables dans votre projet et définissez le paramètre Android: theme dans l'élément d'application dans AndroidManifest.xml :

<application
    ...
    Android:theme="@style/Theme.Example">

Les dessinables dans mon modèle ont été générés via Android Action Bar Style Generator . J'utilise différentes conventions de dénomination pour les ressources. Ce script simple renomme toutes les ressources générées avec Android Générateur de style de barre d'action selon ma propre convention, utilisée dans le modèle.

1
petrnohejl

Ce n'est pas une réponse à la question du PO, mais je vais simplement décrire comment j'ai réussi à obtenir la même exception qu'il mentionne, dans l'espoir que cela puisse aider quelqu'un d'autre:

    Java.lang.RuntimeException: Unable to start activity
    ComponentInfo{com.Merlinia.MMessaging_Test/com.Merlinia.MMessaging_Test.TestObjectsActivity}: 
    Java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.

Dans mon cas, la solution était très simple, même s'il m'a fallu beaucoup trop de temps pour la trouver. Tout ce que vous lisez sur cette exception dit "vérifiez que vous avez spécifié le thème dans le fichier manifest.xml", j'ai donc jeté un coup d'œil à mon fichier manifest.xml, et il était là. Alors j'ai essayé diverses autres choses.

Enfin, j'ai examiné de plus près mon fichier manifest.xml. J'avais fait l'erreur de spécifier le thème de l'activité principale, pas pour toute l'application!

0
RenniePet