2012-03-18 32 views
42

LEER ACTUALIZACIÓN 2 ABAJO PARA LA RESPUESTAAjuste ActionBarSherlock Tema para aplicación Android

Estoy intentando utilizar ActionBarSherlock en mi aplicación. Revisé la versión 4.0.0 del project github repo, lo construí en Netbeans, luego copié el archivo library-4.0.0.jar en el directorio lib de mi proyecto (no estoy usando Eclipse).

Es solo una actividad esqueleto en este momento, y se inicia muy bien en ICS, pero cuando lo ejecuto en Gingerbread recibo la siguiente excepción quejándome de que no tengo el tema de la aplicación para Theme.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 se queja (libro de oraciones: 44) es la llamada a setContentView. La aplicación sólo consta de una sola actividad con un onCreate() método que yo llamo setTheme() a partir de 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); 
} 

que debe estar cubierto el tema de forma incorrecta, pero simplemente no veo cómo. ¿Alguien puede ayudar?

ACTUALIZACIÓN A continuación, CommonsWare señaló que el tema se puede configurar en AndroidManifest.xml. He intentado que de este modo:

<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 me da un error cuando se trata de construir 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 su seguimiento de los comentarios, Pude hacerlo funcionar. Necesitaba agregar ActionBarSherlock como una dependencia del proyecto. Para hacerlo,

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

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

3) Por último, cd de nuevo en el directorio principal de un proyecto y agregar ABS como una dependencia biblioteca con android update project --path . --library ../ActionBarSherlock/library La ruta de acceso al --library en el comando variará en función de donde se desprotegió el repositorio. ActionBarSherlock y el directorio de proyectos de mi aplicación eran directorios hermanos.

+0

Ir a descargar el código fuente de la aplicación ABS de ejemplo en ABS github y echar un vistazo – xDragonZ

+0

Ese fue el primer lugar que verifiqué. En la aplicación demos de ABS, el miembro estático THEME de la clase SampleList se inicializa en R.style.Theme_Sherlock pero nunca se utiliza en esa actividad, excepto para cambiar su valor almacenado en el menú de opciones. Todas las actividades comenzaron a partir de esa actividad principal llamada setTheme() con esa constante como el argumento en la parte superior de su método onCreate(), que es por lo que hago lo mismo en mi código. Notará que la misma instrucción también figura en el segundo párrafo de la sección "Temas para padres" en el sitio de ABS. http://actionbarsherlock.com/theming.html –

Respuesta

75

Normalmente, establece su tema en el manifiesto, como se muestra en the Android developer documentation (y vinculado a desde the ActionBarSherlock theming page).

Si desea utilizar ActionBarSherlock todas partes dentro de su aplicación, esto funciona:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.Sherlock"> 
+3

De hecho. Intenté eso antes de publicar, pero obtengo /AndroidManifest.xml:7: error: Error: no se encontró ningún recurso que coincida con el nombre de pila (en 'tema' con el valor '@ style/Theme.Sherlock'). Actualizaré la pregunta para señalar esto. –

+2

@ArashPayan: elimine el JAR que ha creado.Agregue ActionBarSherlock a su aplicación como un proyecto de biblioteca de Android. Si bien [la documentación de ActionBarSherlock] (http://actionbarsherlock.com/usage.html) (consulte "Incluir en su proyecto") solo cita Eclipse y Maven para saber cómo hacerlo, debería poder agregarlo como un proyecto de biblioteca. en NetBeans siguiendo la documentación del desarrollador de Android: http://developer.android.com/guide/developing/projects/projects-cmdline.html#ReferencingLibraryProject – CommonsWare

+0

Eso fue lo que hizo el truco. Tuve que eliminar el archivo android-support-v4.jar también, porque eso está incluido como parte de ABS. Esbozaré todos los pasos que tomé arriba. ¡Gracias! –

3
<!--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 utilizar el tipo "apklib", es decir que experto va a utilizar todas las fuentes (recursos demasiado) Otra dependencia del archivo jar (alcance "provisto") se usa para lograr un enlace a las clases de sherlock durante la codificación.

19

Para mí, esto fue causado por no usar el prefijo @style/. Es decir. Tenía

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

en lugar de

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

que es un poco raro porque Juro que el valor de la plantilla por defecto es algo así como:

<style name="AppTheme" parent="android:Theme.Holo.Light" /> 
+0

Acabo de toparme con esto, gracias por su respuesta. Definitivamente desperdicia demasiado tiempo probando otras cosas. –

+0

¡Hizo mi día, gracias! – GabrielWeis

1

Si el estilo utilización personalizada quiero, hice a template for custom ActionBarSherlock style. El tema se define en el archivo /values/styles.xml. Se extiende desde Theme.Sherlock.Light theme. Hay muchos parámetros, puede configurar: 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 tabulación, opciones de visualización, etc. Casi todo, lo que necesita, para crear su tema de barra de acciones personalizado. Uso esta plantilla en mis aplicaciones, porque me ayuda a diseñar la barra de acciones muy rápidamente.

Puede encontrar esta plantilla en mi GitHub. Es muy fácil de usar. Sólo tienes que copiar los valores y directiories dibujable en su proyecto y establecer androide: parámetro tema en el elemento de aplicación en AndroidManifest.xml:

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

dibujables en mi plantilla se generaron a través de Android Action Bar Style Generator. Utilizo diferentes convenciones de nomenclatura para recursos. This simple script cambia el nombre de todos los recursos generados con Android Action Bar Style Generator a mi propia convención, utilizada en la plantilla.

1

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

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

Por lo que vale, esa respuesta también se recomienda en este hilo http://stackoverflow.com/questions/12864298/java-lang-runtimeexception-theme-sherlock, pero Jake Wharton, el autor de ActionBarSherlock, escribió en un comentario que la respuesta fue incorrecta. – RenniePet

1

Esto me estaba pasando en IntelliJ IDEA. Resolví este problema yendo a Archivo> Estructura del proyecto> Configuración del proyecto> Facetas> Seleccionar el módulo de barra de acciones de la segunda columna> Verifique la casilla de verificación "Módulo de biblioteca"> Aplicar y Aceptar> Guardar y reconstruir.

ACTUALIZACIÓN Después de una revisión más detallada, mi respuesta original puede ser demasiado específica, y probablemente solo funcione 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 del módulo:

  1. Descargar y extraer la biblioteca ActionBarSherlock de la cremallera (Nota: Sólo es necesario la carpeta “ActionBarSherlock”)
  2. Copiar y pegar junto con su proyecto Android
  3. Abra su proyecto en IntelliJ
  4. Archivo> Estructura del proyecto> Configuración del proyecto> Módulos> Agregar (verde '+' arriba segunda columna)> Importar módulo> Seleccionar el directorio barra de acciones en el diálogo del explorador de archivos> Aceptar> Crear módulo de fuentes existentes> Siguiente
  5. Desactive la carpeta de “prueba” por lo que no se agrega al proyecto y haga clic en “Siguiente”
  6. En la pestaña Bibliotecas, androide-support-v4 debe ser verificada, haga clic en “Siguiente”
  7. En la pestaña Módulos, ActionBarSherlock debe ser verificada, haga clic en “Siguiente”
  8. Si se le pide que Sobrescribir actionbarsherlock.iml, elegir la opción “Sobrescribir” y luego "Finalizar" (usted debe ser devuelto a la sección Módulos de diálogo de la estructura del proyecto)
  9. Seleccionar el módulo actionbarsherlock de la segunda columna y debajo de la pestaña Dependencias en la tercera columna, marca "Exportar" al lado de la biblioteca android-support-v4
  10. ¡Casi allí!
  11. Ahora seleccione el módulo de proyecto de la segunda columna, y debajo de la ficha Dependencias, haga clic en el botón Añadir (verde '+' en el extremo derecho del cuadro de diálogo)
  12. Seleccionar dependencia de módulo y seleccione ActionBarSherlock del diálogo que se aparece y pulse el botón “OK”
  13. Ahora haga clic en “Aplicar” o “OK” para aceptar los cambios

que debe hacer el truco.

0

Esta no es una respuesta a la pregunta de la OP, pero sólo voy a describir cómo me las arreglé para conseguir la misma excepción que se 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 fue muy simple, aunque tardé demasiado en encontrarla. Todo lo que lee sobre esta excepción dice "compruebe que ha especificado el tema en el archivo manifest.xml", así que eché un vistazo rápido a mi archivo manifest.xml, y allí estaba. Entonces probé varias otras cosas.

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

Cuestiones relacionadas