Tema Setting ActionBarSherlock para la aplicación Android


LEA LA ACTUALIZACIÓN 2 A CONTINUACIÓN PARA LA RESPUESTA

Estoy tratando de usar ActionBarSherlock en mi aplicación. Saqué la versión 4.0.0 del repositorio de github del proyecto, la construí en Netbeans y luego copié la biblioteca-4.0.0.archivo jar en el directorio lib de mi proyecto (no estoy usando Eclipse).

Es solo una actividad de esqueleto en este momento, y se inicia muy bien en ICS, pero cuando lo corro en Pan de jengibre obtengo la siguiente excepción quejándose de que no tengo la aplicación tema a Tema.Sherlock (o similar):

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 línea de la que se queja (PrayerBook:44) es la llamada a setContentView. La aplicación solo consiste en una sola actividad con un método onCreate() que llamo setTheme() desde la parte superior:

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

Debo estar configurando el tema incorrectamente, pero simplemente no veo cómo. Alguien puede ayudar?

ACTUALIZACIÓN A continuación, CommonsWare señaló que el tema se puede establecer en el AndroidManifest.XML. Lo he intentado así:

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

Pero Ant da me un error cuando intenta compilar la aplicación:

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

ACTUALIZACIÓN 2 Con la ayuda de CommonsWare en sus comentarios de seguimiento, pude hacerlo funcionar. Necesitaba agregar ActionBarSherlock como una dependencia del proyecto. Para ello,

1) Eliminé library-4.0.0.jar y android-support-4.0.jar del directorio lib de mi proyecto.

2) A continuación, navegue a la carpeta library dentro de la raíz del directorio ActionBarSherlock extraído de github. Escriba android update project para crear un archivo build.xml y proguard.cfg para la biblioteca.

3) Finalmente, cd vuelva al directorio principal del proyecto y agregue ABS como una dependencia de biblioteca con android update project --path . --library ../ActionBarSherlock/library La ruta al --library en el comando variará de acuerdo con el lugar donde se realizó el repositorio. ActionBarSherlock y el directorio del proyecto de mi aplicación eran directorios hermanos.

Author: Arash Payan, 2012-03-18

7 answers

Por lo general, se establece el tema en el manifiesto, como se muestra en la documentación para desarrolladores de Android (y vinculado a desde la página de tematización de ActionBarSherlock).

Si quieres usar ActionBarSherlock en todas partes dentro de tu app, esto funciona:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock">
 75
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-18 11:10:53

Para mí esto fue causado por no usar el prefijo @style/. I. e. I had

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

En lugar de

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

Lo cual es un poco raro porque juro que el valor predeterminado de la plantilla es algo así como:

<style name="AppTheme" parent="android:Theme.Holo.Light" />
 19
Author: Timmmm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-01 15:18:37
<!--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>

La sugerencia es usar el tipo "apklib", eso significa que maven usará todas las fuentes (recursos también). Otro archivo dependecy a jar (ámbito "proporcionado") se utiliza para lograr el enlace a las clases sherlock durante la codificación.

 3
Author: Apple.Dragon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-31 07:55:55

Tenía el mismo problema. La aplicación se bloqueó aunque el tema se estableció en el manifiesto. Configurar el tema programáticamente resolvió el problema:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
 1
Author: Apfelsaft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 12:12:43

Esto me estaba sucediendo en IntelliJ IDEA. Resolví este problema yendo a Archivo > Estructura del proyecto > Configuración del proyecto > Facetas > Seleccione el módulo actionbarsherlock en la 2a columna > Marque la casilla de verificación "Módulo de biblioteca" > Aplicar y Aceptar > Guardar y reconstruir.

UPDATE Después de una revisión adicional, mi respuesta original puede ser demasiado específica, y probablemente solo funcionará en ciertos casos. Este error significa que las dependencias no se han configurado correctamente. En IntelliJ IDEA, siga estos pasos para configurar correctamente actionbarsherlock como una dependencia de módulo:

  1. Descargue y extraiga la biblioteca actionbarsherlock del zip (Nota: Solo necesita la carpeta "actionbarsherlock")
  2. Copiar y pegar junto a su proyecto Android
  3. Abra su proyecto en IntelliJ
  4. File > Project Structure > Project Settings > Modules > Add (green '+' above second column) > Import Module > Select actionbarsherlock directory in file browser dialog > OK > Create módulo de fuentes existentes Siguiente >
  5. Desmarque la carpeta "test" para que no se agregue al proyecto y haga clic en "Next"
  6. En la pestaña Bibliotecas, android-support-v4 debe estar marcado, haga clic en"Siguiente"
  7. En la pestaña Módulos, actionbarsherlock debe estar marcado, haga clic en "Siguiente"
  8. Si le pide que sobrescriba actionbarsherlock.iml, elija "Sobrescribir" y luego "Finalizar" (Debe regresar a la sección Módulos del diálogo Estructura del proyecto)
  9. Seleccione la módulo actionbarsherlock desde el segundo colum y en la pestaña Dependencias en la tercera columna, marque "Exportar" junto a la biblioteca android-support-v4
  10. Casi ahí!
  11. Ahora seleccione su módulo de proyecto desde la segunda columna, y bajo la pestaña Dependencias, haga clic en el botón Agregar (verde '+' en el extremo derecho del diálogo)
  12. Seleccione Dependencia del módulo y elija actionbarsherlock en el cuadro de diálogo que aparece y presione"OK"
  13. Ahora haga clic en "Aplicar" o "Aceptar" para aceptar los cambios

Eso debería hacer el truco.

 1
Author: kahmali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-12 02:17:07

Si quieres usar estilo personalizado, hice un plantilla para ActionBarSherlock estilo personalizado. El tema se define en / values / styles.archivo xml. Se extiende desde el tema.Sherlock.Tema ligero. Hay muchos parámetros, puede establecer: icono, logotipo, divisor, título, superposición de sombras, botones de menú de acción, menú emergente, fondo de modo de acción, navegación de lista desplegable, estilo de pestaña, opciones de visualización, etc. Casi todo, lo que necesita, para crear su tema de barra de acción personalizada. Yo uso esto plantilla en mis aplicaciones, porque me ayuda a estilo barra de acción muy rápidamente.

Puedes encontrar esta plantilla en mi GitHub. Es muy fácil de usar. Simplemente copie valores y direcciones de elementos de diseño en su proyecto y establezca el parámetro android:theme en el elemento application en AndroidManifest.xml :

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

Los elementos de diseño de mi plantilla se generaron a través de Android Action Bar Style Generator. Uso una convención de nomenclatura diferente para los recursos. Este simple script cambia el nombre de todos los recursos generados con Android Action Bar Style Generator a my own convention, utilizado en la plantilla.

 1
Author: petrnohejl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-03 19:18:15

Esta no es una respuesta para la pregunta de la OP, pero solo describiré cómo logré obtener la misma excepción que menciona, con la esperanza de que pueda ayudar a alguien más:

    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.

En mi caso la solución era muy simple, aunque me llevó demasiado tiempo encontrarla. Todo lo que lees sobre esta excepción dice " comprueba que has especificado el tema en el manifiesto.archivo xml", así que eché un vistazo rápido a mi manifiesto.archivo xml, y ahí estaba. Así que probé varias otras cosas.

Finalmente, eché un vistazo más de cerca a mi manifiesto.archivo xml. Había cometido el error de especificar el tema para la actividad principal, no para toda la aplicación!

 0
Author: RenniePet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-01 23:07:30